谁能解释正则表达式引擎匹配的(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 回答