朋友我在字符串@"^(.*)([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"
应该在那里。请帮助
答案 0 :(得分:3)
你的问题是由使用贪婪的量词.*
引起的,而不是试图"吃掉"一切都可以。
使用延迟量词:
^(.*?)([0-9/+^-]+)=([0-9]+)
这会导致.*?
在找到整体匹配时尽可能匹配:量词将停留在您示例中的4
。
也不要忘记-
是一个字符类中的特殊字符,要逃避它,你需要把它放在开头或结尾([...-]
)或{{1将成为一个范围。
发生了什么
我们的正则表达式[+-^]
与任何其他正则表达式一样,希望返回匹配项。为了做到这一点,它需要找到:"任何长度的东西,其后至少是(.*)([0-9/+-^]+)
范围内的一个字符"。
仅遵循此规则,当应用于[0-9/+-^]
时,正则表达式可能会首先查看匹配:
3u->4+5
,第二组中的3u->4+
(第二组只需要一个数字 5
,第二组中的3u->4
+5
,第二组中的3u->
那么,我们应该匹配哪一个?
为了知道选择哪一个,(启发式和简化的)规则是:
4+5
量词是贪婪,它总会尝试匹配最多*
)它会尽可能匹配(而正则表达式仍在返回全局匹配)。