给定正则表达式"\d"
,它将匹配“a123b456”中的每个数字(即1、2、3、4、5、6)。
给定正则表达式"\d\d"
和相同的测试字符串,它似乎只匹配“12”和“45” - 这至少是http://regexpal.com/所说的,类似地,我使用 C++ 教科书(其中使用升压/正则表达式)。
为什么第二个不匹配“23”和“56”,或者,如果该行为是正确的,为什么第一个匹配每个数字?
给定正则表达式"\d"
,它将匹配“a123b456”中的每个数字(即1、2、3、4、5、6)。
给定正则表达式"\d\d"
和相同的测试字符串,它似乎只匹配“12”和“45” - 这至少是http://regexpal.com/所说的,类似地,我使用 C++ 教科书(其中使用升压/正则表达式)。
为什么第二个不匹配“23”和“56”,或者,如果该行为是正确的,为什么第一个匹配每个数字?
为什么第二个不匹配“23”和“56”?
因为这是您期望正则表达式给您的重叠匹配。一旦字符串的一部分与一个模式匹配,它将不会再次与相同的模式匹配。因此,由于2
已经包含在上一场比赛中12
,所以它已经消失了。正则表达式将移动到下一个字符,即3
. 并且在该字符之后,它看不到3
包含为另一个字符串匹配的一部分\d\d
。与此模式匹配的下一个子字符串仅在45
.
尝试将您的字符串更改为:
"a1234b456"
你会得到三个匹配项 - 12
、34
和45
。
但是,您可以使用正向前瞻-获得重叠匹配(?=\d\d)
,因为环顾四周是0 长度匹配表达式。他们不会消耗他们匹配的字符。
仅供参考,您可以使用\d{2}
而不是\d\d
.
如果您想匹配所有结果,您可以使用向前/向后
(?=\d\d)