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"
应该在那里。请帮忙
您的问题是由使用贪婪的量词引起的,.*
它会尝试"吃掉"它所能吃掉的一切。
请改用惰性量词:
^(.*?)([0-9/+^-]+)=([0-9]+)
这将导致.*?
在查找总体匹配时尽可能少地匹配:量词将在示例中的4
处停止。
另外不要忘记-
字符类中的特殊字符,要转义它,您需要将其放在开头或结尾([...-]
),否则[+-^]
将成为范围。
发生了什么事情
我们的正则表达式(.*)([0-9/+-^]+)
,像任何其他正则表达式一样,想要返回匹配项。为了做到这一点,它需要找到:"任何长度的东西,后跟至少一个[0-9/+-^]
范围内的字符"。
仅遵循此规则,当应用于3u->4+5
时,正则表达式可以在第一次视图匹配:
- 第一组中
3u->4+
,第二组中5
(第二组只需要一位数字即可匹配) - 第一组中
3u->4
,第二组中+5
- 第一组中
3u->
,第二组中4+5
那么,我们应该匹配哪一个呢?
为了知道选择哪一个,(启发式和简化)规则是:
- 如果
*
量词是贪婪的,它将始终尝试匹配它所能达到的最大值 - 如果它是懒惰的(所以如果你使用
*?
),它将尽可能匹配最少(而正则表达式仍在返回全局匹配)。
您可以在此处或此处阅读有关该主题的更多信息,其中将更深入地解释一般的基本规则和微妙之处。