给定正则表达式"\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)