我的正則表達式不會選擇與內部文本最接近的'cont'對。我該如何解決這個問題?非貪婪的正則表達式不會選擇最接近的選擇
輸入:
cont cont ItextI /cont /cont
正則表達式:
cont.*?I(.*?)I.*?/cont
比賽:
cont cont ItextI /cont
比賽,我需要:
cont ItextI /cont
我的正則表達式不會選擇與內部文本最接近的'cont'對。我該如何解決這個問題?非貪婪的正則表達式不會選擇最接近的選擇
輸入:
cont cont ItextI /cont /cont
正則表達式:
cont.*?I(.*?)I.*?/cont
比賽:
cont cont ItextI /cont
比賽,我需要:
cont ItextI /cont
cont(?:(?!/?cont).)*I(.*?)I(?:(?!/?cont).)*/cont
只會匹配最裏面的塊。
說明:
cont # match "cont"
(?: # Match...
(?!/?cont) # (as long as we're not at the start of "cont" or "/cont")
. # any character.
)* # Repeat any number of times.
I # Match "I"
(.*?) # Match as few characters as possible, capturing them.
I # Match "I"
(?: # Same as above
(?!/?cont)
.
)*
/cont # Match "/cont"
此明確禁止cont
或/cont
到開口cont
和待捕獲的文本(以及文本和閉合/cont
之間)之間出現。
您在cont cont ItextI /cont
上匹配的原因是,正則表達式匹配第一個「cont」上的cont
模式的第一部分,然後它使用不情願的.*?
吞噬ItextI
之前的空白,下一個連續和空白。當它到達ItextI
時,它將I
識別爲匹配模式的下一部分,並繼續處理其餘的正則表達式。正如minitech寫道的,這是因爲正則表達式正在從字符串的開頭開始工作,並找到儘可能早的匹配。
如果你能做出空白的假設,你可以寫:
cont\s+I(.*?)I\s+/cont
這將匹配在你上面的例子。
強制鏈接:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – user123444555621 2012-02-05 16:37:02