【问题标题】:C# split math expression in TermsC# 在术语中拆分数学表达式
【发布时间】:2020-09-02 17:16:53
【问题描述】:

我需要一些可以像这样拆分表达式的东西:

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}

【问题讨论】:

  • "...like this:" 是有问题的。读者可以建议您如何以您想要的方式拆分该特定字符串,但该解决方案可能不适用于您可能希望拆分的其他字符串,例如"2e^{x^{2}+{e^{2}+1}}+x-x^{2}"。顺便说一句,人们通常在这样的表达式中看到括号而不是大括号。
  • 试试\w+(\^\{(?>[^{}]+|(?<o>{)|(?<-o>}))*})?|[+-]
  • @WiktorStribiżew 这行得通,但这只能用 e^ 保护条款
  • 当然,您问“可以像这样拆分表达式的东西”。如果您需要更多帮助,请详细说明您需要什么。

标签: c# regex string list split


【解决方案1】:

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

(?=[+-])(?![^{]+})|(?<=[+-])(?![^{]+})

设置了多行标志。

Demo(点击“拆分列表”)

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

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

.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^{+2+x+x^{2}}+xx^{2​​} 的情况,如果我将指数项放在这里 x ^{2} 在 e^ Term 的末尾,它们是之前的其他术语
  • 大神,我在回答中说过,我假设没有嵌套大括号,就像您评论中的表达式一样。我不知道是不是这个问题,但我过会看看。
  • 大神,让我们看看当正则表达式引擎的指针正好位于"2e^{+2+x+x^{2}}+x-x^{2}" 中的第一个"+" 之前会发生什么。积极的前瞻(?=[+-]) 是满意的。负前瞻(?![^{]+}) 中的[^{]+"+2+x+x^" 匹配。但是,下面的字符 "2" 与正则表达式中的 } 不匹配,因此否定前瞻失败(即未成功找到匹配项),这意味着第一个 "+" 匹配。但是,它只是匹配的,因为字符串包含嵌套的大括号...
  • 这就是为什么我在回答中说我假设(如您的问题)没有嵌套的大括号并且大括号是平衡的。这也是我对这个问题发表“like this”评论的原因,在这里我举了一个带有嵌套大括号的字符串示例,它不是“like this”。
猜你喜欢
  • 2018-02-03
  • 2019-02-27
  • 1970-01-01
  • 2021-08-09
  • 1970-01-01
  • 2015-05-02
  • 1970-01-01
  • 2017-10-03
  • 2017-09-09
相关资源
最近更新 更多