任何人都可以解释正则表达式引擎与(aa)+\1
匹配aaaaaa
的过程吗?我知道当您使用+
或*
时,会有一个称为回溯的过程,但我不确定它在此示例中是如何工作的。
答案 0 :(得分:14)
当您将量词放在捕获组之外时,它不会使用量词捕获与该模式匹配的整个字符串。它只匹配模式匹配的最后一次重复。
因此,(aa)+
不会捕获捕获组中的aaaa
,而只捕获最后一对 - aa
,以便它可以满足其余的正则表达式模式。
因此,对于(aa)+\1
,模式首先匹配 - aaaa
,然后反向引用\1
匹配捕获的组 - aa
。因此匹配字符串 - aaaaaa
。 (aa)+
不会与a's
完全匹配,因为\1
将不会留下任何内容。
这是正则表达式(aa)+\1
:
(aa)+
匹配字符串中的前两个aa
。剩余字符串 - aaaa
。(aa)+
还有更多要匹配的内容,因此会继续匹配下一个aa
。剩余字符串 - aa
。(aa)+
可以匹配剩余的字符串。所以它匹配下一个aa
。剩余字符串 - ""
。请记住,默认情况下,量词会 greedy 。他们将尽可能多地匹配。(aa)+
无法进一步匹配。 \1
。但没有什么可以匹配的。(aa)+
匹配的最后一个模式。剩余字符串 - "aa"
。\1
再次尝试匹配,并成功匹配aa
,因为这是当前在1 st 捕获组中的内容。<强>参考文献:强>
答案 1 :(得分:4)
+
量词表示“1或更多”。 \1
指的是捕获的组,这与量词所指的相同。如此有效,它说“组aa,1次或更多次,然后再一次”。这与“2次或更多次”相同。
因此正则表达式可能更加清晰:/(aa){2,}/
由于aaaaaa
是aa
组的三组,因此正则表达式与字符串匹配。
答案 2 :(得分: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