0

给定正则表达式"\d",它将匹配“a123b456”中的每个数字(即1、2、3、4、5、6)。

给定正则表达式"\d\d"和相同的测试字符串,它似乎只匹配“12”和“45” - 这至少是http://regexpal.com/所说的,类似地,我使用 C++ 教科书(其中使用升压/正则表达式)。

为什么第二个不匹配“23”和“56”,或者,如果该行为是正确的,为什么第一个匹配每个数字?

4

2 回答 2

5

为什么第二个不匹配“23”和“56”?

因为这是您期望正则表达式给您的重叠匹配。一旦字符串的一部分与一个模式匹配,它将不会再次与相同的模式匹配。因此,由于2已经包含在上一场比赛中12,所以它已经消失了。正则表达式将移动到下一个字符,即3. 并且在该字符之后,它看不到3包含为另一个字符串匹配的一部分\d\d。与此模式匹配的下一个子字符串仅在45.

尝试将您的字符串更改为:

"a1234b456"

你会得到三个匹配项 - 123445

但是,您可以使用正向前瞻-获得重叠匹配(?=\d\d),因为环顾四周0 长度匹配表达式。他们不会消耗他们匹配的字符。

仅供参考,您可以使用\d{2}而不是\d\d.

于 2013-07-21T13:40:40.723 回答
2

如果您想匹配所有结果,您可以使用向前/向后

(?=\d\d)
于 2013-07-21T13:44:14.787 回答