C# 正则表达式 - 将文本分解为特定部分

本文关键字:定部 分解 文本 正则表达式 | 更新日期: 2023-09-27 17:57:15

朋友们,我正在字符串"3u->4+5=8"上应用 R.E @"^(.*)([0-9/+-^]+)=([0-9]+)$" .在获取Group[1]时,它返回"3u->4+"Group[2]返回"5" .

据我说,

Group[0]="3u->4+5=8"   
Group[1]="3u->"   
Group[2]="4+5"   
Group[3]="8"

应该在那里。请帮忙

C# 正则表达式 - 将文本分解为特定部分

您的问题是由使用贪婪的量词引起的,.* 它会尝试"吃掉"它所能吃掉的一切。

请改用惰性量词:

^(.*?)([0-9/+^-]+)=([0-9]+)

这将导致.*?在查找总体匹配时尽可能少地匹配:量词将在示例中的4处停止。

另外不要忘记-字符类中的特殊字符,要转义它,您需要将其放在开头或结尾([...-]),否则[+-^]将成为范围。


发生了什么事情

我们的正则表达式(.*)([0-9/+-^]+) ,像任何其他正则表达式一样,想要返回匹配项。为了做到这一点,它需要找到:"任何长度的东西,后跟至少一个[0-9/+-^]范围内的字符"。

仅遵循此规则,当应用于3u->4+5时,正则表达式可以在第一次视图匹配:

  • 第一组中3u->4+,第二组中5(第二组只需要一位数字即可匹配)
  • 第一组中3u->4,第二组中+5
  • 第一组中3u->,第二组中4+5

那么,我们应该匹配哪一个呢?

为了知道选择哪一个,(启发式和简化)规则是:

  • 如果*量词是贪婪的,它将始终尝试匹配它所能达到的最大值
  • 如果它是懒惰的(所以如果你使用 *? ),它将尽可能匹配最少(而正则表达式仍在返回全局匹配)。

您可以在此处或此处阅读有关该主题的更多信息,其中将更深入地解释一般的基本规则和微妙之处。