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

时间:2014-04-08 12:25:47

标签: c# regex

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

据我说,

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

应该在那里。请帮助

1 个答案:

答案 0 :(得分:3)

你的问题是由使用贪婪的量词.*引起的,而不是试图"吃掉"一切都可以。

使用延迟量词:

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

这会导致.*?在找到整体匹配时尽可能匹配:量词将停留在您示例中的4

也不要忘记-是一个字符类中的特殊字符,要逃避它,你需要把它放在开头或结尾([...-])或{{1将成为一个范围。


发生了什么

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

仅遵循此规则,当应用于[0-9/+-^]时,正则表达式可能会首先查看匹配:

    第一组中的
  • 3u->4+5,第二组中的3u->4+(第二组只需要一个数字
  • ) 第一组中的
  • 5,第二组中的3u->4
  • 第一组中的
  • +5,第二组中的3u->

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

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

  • 如果4+5量词是贪婪,它总会尝试匹配最多
  • 如果它是 lazy (所以如果你正在使用*)它会尽可能匹配(而正则表达式仍在返回全局匹配)。

您可以阅读有关主题herehere的更多信息,其中更深入地解释了一般基本规则和细微之处。

相关问题