問題描述:
匹配一對標記<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}?>,一個懶惰量詞會重複儘可能少的次數。從前往後推。
<*>最長可能的匹配。
<*?>最短可能的匹配。