给定正则表达式"\d"
,它将匹配“a123b456”中的每个数字(即1,2,3,4,5,6)。
给定正则表达式"\d\d"
和相同的测试字符串,它似乎只匹配“12”和“45” - 这至少是http://regexpal.com/所说的,类似于我自己创建的正则表达式求值器C ++教科书(使用boost / regex)。
为什么第二个匹配“23”和“56”,或者,如果该行为是正确的,为什么第一个匹配每个数字?
答案 0 :(得分:5)
为什么第二个不匹配“23”和“56”?
因为那是你期待正则表达式给你的重叠匹配。一旦字符串的一部分与模式匹配,它将不会再次匹配相同的模式。因此,由于2
已作为12
包含在上一个匹配项中,因此它已消失。正则表达式将移动到3
的下一个字符。并且跟随该字符后,它无法将3
包含为另一个匹配\d\d
的字符串的一部分。匹配此模式的下一个子字符串仅在45
处找到。
尝试将字符串更改为:
"a1234b456"
您将获得三场比赛 - 12
,34
和45
。
但是,您可以使用正面预测 - (?=\d\d)
来获得重叠匹配,因为环视 0-length 匹配表达。他们不会消耗他们匹配的字符。
仅供参考,您可以使用\d{2}
代替\d\d
。
答案 1 :(得分:2)
如果您想匹配所有结果,您可以使用向前/向后
(?=\d\d)