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