正则表达式导致多样性

时间:2013-07-21 13:37:42

标签: regex

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

给定正则表达式"\d\d"和相同的测试字符串,它似乎只匹配“12”和“45” - 这至少是http://regexpal.com/所说的,类似于我自己创建的正则表达式求值器C ++教科书(使用boost / regex)。

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

2 个答案:

答案 0 :(得分:5)

  

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

因为那是你期待正则表达式给你的重叠匹配。一旦字符串的一部分与模式匹配,它将不会再次匹配相同的模式。因此,由于2已作为12包含在上一个匹配项中,因此它已消失。正则表达式将移动到3的下一个字符。并且跟随该字符后,它无法将3包含为另一个匹配\d\d的字符串的一部分。匹配此模式的下一个子字符串仅在45处找到。

尝试将字符串更改为:

"a1234b456"

您将获得三场比赛 - 123445

但是,您可以使用正面预测 - (?=\d\d)来获得重叠匹配,因为环视 0-length 匹配表达。他们不会消耗他们匹配的字符。

仅供参考,您可以使用\d{2}代替\d\d

答案 1 :(得分:2)

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

(?=\d\d)