7

谁能解释正则表达式引擎匹配的(aa)+\1过程aaaaaa?我知道当您使用时有一个称为回溯的过程+*但是我不确定它在这个示例中是如何工作的。

4

3 回答 3

14

当您将量词放在捕获组之外时,它不会捕获与带有量词的该模式匹配的整个字符串。它只是匹配模式匹配的最后一个重复。

所以,(aa)+不会aaaa在捕获组中捕获,而只是最后一对 - aa,这样它就可以满足正则表达式模式的其余部分。

因此,使用(aa)+\1,模式首先匹配 - aaaa,然后反向引用\1匹配捕获的组 - aa。因此 is 匹配字符串 - aaaaaa。Not(aa)+不会匹配所有的a's,因为这样就没有任何东西可以匹配了\1

这是正则表达式的分解(aa)+\1

  • (aa)+匹配aa字符串中的前两个。剩余字符串 - aaaa
  • 还有更多要匹配的(aa)+,所以它继续匹配下一个aa。剩余字符串 - aa
  • 再次(aa)+可以匹配剩余的字符串。所以它匹配下一个aa。剩余字符串 - ""。请记住,量词默认行为贪婪。他们将尽可能匹配。
  • 现在,(aa)+无法再匹配了。
  • 模式中的下一个是\1. 但是没有什么可以匹配的了。
  • 回溯由 匹配的最后一个模式(aa)+。剩余字符串 - "aa"
  • 现在\1再次尝试匹配,它成功匹配aa,因为这是当前第一个捕获组中的内容。

参考:

于 2013-08-24T14:59:32.087 回答
4

+量词的意思是“1个或多个”。指的\1是捕获的组,这与量词所指的是同一事物。如此有效,它在说“组 aa,1 次或多次,然后再一次”。这与“2次或多次”相同。

所以正则表达式可能会更清晰:/(aa){2,}/

由于aaaaaa是三组aa组,正则表达式匹配字符串。

于 2013-08-24T14:58:44.003 回答
4

设想:

aa           # the group is matched
aaaa         # the group is repeated once, cause the + quantifier
aaaaaa       # the group is repeated once again, always cause 
             # the + quantifier (and because it is greedy and take all it can.)
             # But since all the characters are eaten, and there is \1
             # the pattern will fail.
aaaa         # the regex engine must backtrack to try another way because of \1
aaaaaa       # you are arrived! (the 2 last "a" are for the \1

您可以使用禁止回溯的所有格量词 (++) 来验证此行为:

(aa)++\1            # will never match
于 2013-08-24T15:07:40.067 回答