正則表達式 回溯規則與問號(懶惰量詞)的使用

問題描述:

匹配一對標記<p>和</p>以及二者之間的所有文本。

<p>
    The very .......beginning of a parapraph.
</p>
<p>
    Then you have to find the end of the paragraph
</p>

解決方案:

<p>.*?</p>

不正確的:

<p>.*</p>     少了一個問號

理由 :

在匹配了目標文本中的第一個 <p>之後,引擎會達到 <  .* > 。*號會匹配到文本結束的所有內容。當< .* >把肚子吃飽後,引擎纔會試圖去匹配目標文本末尾的 '<' 。引擎回溯,在文本的最後一個位置,顯然會失敗,如果失敗,那麼引擎會再一次回溯,在文本的倒數第二個字符處嘗試匹配 '<'。這個過程會一直繼續,直到匹配 '<'成功。如果一直沒有匹配到,那麼最終 <.*>會用完所有回溯位置,然後整個匹配宣佈失敗。

如果在整個回溯過程中'<'匹配到了,那麼接着嘗試匹配</>,如果匹配失敗,引擎會接着進行回溯,直到</p>整個被匹配到。最後匹配到的是整個內容。從後往前推。

在其後放一個問題來使任何量詞變成懶惰量詞,如 <*? > 、<+?>、<??>、<{7,42}?>,一個懶惰量詞會重複儘可能少的次數。從前往後推。

<*>最長可能的匹配。

<*?>最短可能的匹配。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章