正则表达式“(aa)+ \ 1”如何匹配“aaaaaa”?

时间:2013-08-24 14:57:02

标签: regex backtracking

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

3 个答案:

答案 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,}/

由于aaaaaaaa组的三组,因此正则表达式与字符串匹配。

答案 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