Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/298.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# C分割数学表达式的术语_C#_Regex_String_List_Split - Fatal编程技术网

C# C分割数学表达式的术语

C# C分割数学表达式的术语,c#,regex,string,list,split,C#,Regex,String,List,Split,我需要一些可以拆分如下表达式的内容: string expression = "2e^{x^{2}+2}+x-x^{2}"; 0: 2e^{x^2}+2} 1: + 2: x 3: - 4: x^{2} var Terms = Regex.Split(PolynomString, @"\s*([-+/*])\s*").Where(n => !string.IsNullOrEmpty(n)).ToList(); 我想将这些术语保存在如下列表中: string expression =

我需要一些可以拆分如下表达式的内容:

string expression = "2e^{x^{2}+2}+x-x^{2}";
0: 2e^{x^2}+2}
1: +
2: x
3: -
4: x^{2}
var Terms = Regex.Split(PolynomString, @"\s*([-+/*])\s*").Where(n => !string.IsNullOrEmpty(n)).ToList();
我想将这些术语保存在如下列表中:

string expression = "2e^{x^{2}+2}+x-x^{2}";
0: 2e^{x^2}+2}
1: +
2: x
3: -
4: x^{2}
var Terms = Regex.Split(PolynomString, @"\s*([-+/*])\s*").Where(n => !string.IsNullOrEmpty(n)).ToList();
现在我像这样分裂:

string expression = "2e^{x^{2}+2}+x-x^{2}";
0: 2e^{x^2}+2}
1: +
2: x
3: -
4: x^{2}
var Terms = Regex.Split(PolynomString, @"\s*([-+/*])\s*").Where(n => !string.IsNullOrEmpty(n)).ToList();
但这也会将我的术语拆分为我不想要的指数:

0: 2e^{x^{2}
1: +
2: 2}
3: +
4: x
5: -
6:x^{2}

可以根据以下正则表达式的匹配项进行拆分

(?=[+-])(?![^{]+})|(?<=[+-])(?![^{]+})
设置了多行标志

单击拆分列表

请注意,所有匹配项在“-”和“+”之前和之后都是零宽度位置

我假设所有的大括号都是平衡的,没有嵌套的大括号

.NET正则表达式引擎执行以下操作

(?=[+-])    the following char must be '+' or '-'
(?![^{]+})  the current location cannot be followed by 1+ chars 
            other than '}' followed by '}'
|           or
(?<=[+-])   the preceding char must be '+' or '-'         
(?![^{]+})  the current location cannot be followed by 1+ chars
            other than '}' followed by '}'

看看……像这样:这是有问题的。读者可以建议您如何以您想要的方式拆分该特定字符串,但该解决方案可能不适用于您可能希望拆分的其他字符串,例如2e^{x^{2}+{e^{2}+1}+x-x^{2}。顺便说一句,在这样的表达式中,人们通常会看到括号而不是大括号。试试\w+\\\\{>[^{}]+{124;?{124;?}?{124+-]@WiktorStribiżew这是可行的,但这只会确保术语的安全。当然,你问了一些可以像这样拆分表达式的问题。如果你需要更多的帮助,请详细解释你需要什么。但是发现对于2e^{+2+x+x^{2}+x-x^{2}的情况,如果我在e^项的末尾放一个指数项x^{2},并且它们是主之前的其他项,我在回答中说,我假设没有嵌套的大括号,那么分割就不会像预期的那样工作,就像你评论中的表达一样。我不知道这是否是问题所在,但过一会儿我会看一看。Ma Lord,让我们看看当正则表达式引擎的指针正好位于2e^{+2+x+x^{2}+x-x^{2}中的第一个+之前时会发生什么。正向前瞻?=[+-]已满足。负前瞻中的[^{]+}与正则表达式中的+2+x+x^匹配。但是,下面的字符2与}不匹配,因此负前瞻失败,即未能找到匹配,这意味着第一个+匹配。但是,它只是匹配的,因为字符串包含嵌套的大括号…这就是为什么我在回答中说,我假设在你的问题中没有嵌套的大括号,大括号是平衡的。这也是我对这个问题做出这样评论的原因,在这里我给出了一个嵌套大括号的字符串的例子,它不是这样的。