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与}不匹配,因此负前瞻失败,即未能找到匹配,这意味着第一个+匹配。但是,它只是匹配的,因为字符串包含嵌套的大括号…这就是为什么我在回答中说,我假设在你的问题中没有嵌套的大括号,大括号是平衡的。这也是我对这个问题做出这样评论的原因,在这里我给出了一个嵌套大括号的字符串的例子,它不是这样的。