2013-08-24 48 views

回答

14

當您將量詞放在捕獲組之外時,它不會捕獲與量詞相匹配的整個字符串。它只是匹配模式匹配的最後一次重複。

因此,(aa)+不會捕獲aaaa捕獲組,但只是最後一對 - aa,以便它可以滿足其餘的正則表達式模式。

因此,使用(aa)+\1,模式匹配第一個 - aaaa,然後反向引用\1與捕獲的組匹配 - aa。因此匹配字符串 - aaaaaa。不是(aa)+將不會匹配所有的a's,因爲那樣就不會有任何遺留的東西被\1匹配。

這裏有向上突破的正則表達式(aa)+\1的:

  • (aa)+字符串中相匹配的前兩個aa。剩餘字符串 - aaaa
  • 還有更多需要搭配(aa)+,因此它會繼續匹配下一個aa。剩餘字符串 - aa
  • 再次(aa)+可以匹配剩餘的字符串。所以它匹配下一個aa。剩餘字符串 - ""。請記住,量詞默認爲貪婪。他們會盡可能匹配。
  • 現在,(aa)+無法進一步匹配。
  • 下一步該模式爲\1。但是沒有什麼可以匹配的。
  • 回溯與(aa)+相匹配的最後一個模式。剩餘字符串 - "aa"
  • 現在\1再次嘗試匹配,並且它成功匹配aa,因爲那是當前捕獲組中的所有內容。

參考文獻:

+0

感謝您的出色答案!你能評論一下如果我這樣做會發生什麼:'(aa +)\ 1',我把量詞放在捕捉組裏面了嗎? – bodacydo

+1

也許我應該問另一個問題:「(aa +)\ 1'與(aa)+ \ 1'有什麼不同? – bodacydo

+1

@bodacydo:'(aa +)\ 1'會匹配給定的字符串,'aaa'代表捕獲組+ +量詞將取所有字符串的「a」,並且正則表達式引擎會逐字回退,直到匹配模式匹配。 –

4

+量詞表示「1或更多」。 \1指的是被捕獲的組,這與量詞所指的相同。所以有效地說,「分組aa,一次或多次,然後再一次」。這與「2次以上」相同。

所以,正則表達式可能是因爲這更清楚的:/(aa){2,}/

由於aaaaaa是三套aa組,正則表達式匹配字符串。

+0

這並不能解釋*如何執行匹配(即,回溯),這是OP要求的。 – Bakuriu

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 

可以使用所有格QUA驗證此行爲(++):

(aa)++\1   # will never match