任何人都可以解釋一個正則表達式引擎匹配(aa)+\1
與aaaaaa
的過程嗎?我知道當您使用+
或*
時有一個稱爲回溯的過程,但我不確定它在此示例中的工作原理。正則表達式「(aa)+ 1」如何匹配「aaaaaa」?
7
A
回答
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
,因爲那是當前捕獲組中的所有內容。
參考文獻:
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
相關問題
- 1. 正則表達式匹配0或1
- 2. 正則表達式匹配0至1
- 3. 正則表達式:與(aa | bb)(cc)相匹配?
- 4. 正則表達式/ Java。用'aa'序列匹配單詞
- 5. 正則表達式匹配
- 6. 正則表達式匹配
- 7. 正則表達式匹配%
- 8. 正則表達式匹配
- 9. 正則表達式匹配
- 10. 正則表達式 - 匹配
- 11. 正則表達式匹配
- 12. 匹配正則表達式
- 13. 正則表達式 - 匹配
- 14. 正則表達式匹配
- 15. 正則表達式匹配
- 16. 正則表達式匹配
- 17. 正則表達式匹配
- 18. 匹配正則表達式{
- 19. 正則表達式匹配
- 20. 正則表達式匹配「|」
- 21. 正則表達式匹配
- 22. 正則表達式匹配
- 23. 正則表達式匹配
- 24. 正則表達式:匹配
- 25. 正則表達式匹配@「*」
- 26. 匹配正則表達式
- 27. 正則表達式:匹配
- 28. 匹配正則表達式
- 29. 正則表達式匹配
- 30. 正則表達式匹配
感謝您的出色答案!你能評論一下如果我這樣做會發生什麼:'(aa +)\ 1',我把量詞放在捕捉組裏面了嗎? – bodacydo
也許我應該問另一個問題:「(aa +)\ 1'與(aa)+ \ 1'有什麼不同? – bodacydo
@bodacydo:'(aa +)\ 1'會匹配給定的字符串,'aaa'代表捕獲組+ +量詞將取所有字符串的「a」,並且正則表達式引擎會逐字回退,直到匹配模式匹配。 –