2012-02-05 48 views
4

我的正則表達式不會選擇與內部文本最接近的'cont'對。我該如何解決這個問題?非貪婪的正則表達式不會選擇最接近的選擇

輸入:

cont cont ItextI /cont /cont 

正則表達式:

cont.*?I(.*?)I.*?/cont 

比賽:

cont cont ItextI /cont 

比賽,我需要:

cont ItextI /cont 
+0

強制鏈接:http://stackoverflow.com/questions/1732348/regex-match-open-tags-except-xhtml-self-contained-tags – user123444555621 2012-02-05 16:37:02

回答

12
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之間)之間出現。

+0

謝謝!這些結構的名稱是什麼?我用(?<= cont)。*?I(。*?)I。*?/ cont這個也可以。 – snowindy 2012-02-05 16:37:43

+0

好吧我已經得到它了!再次感謝 – snowindy 2012-02-05 16:39:04

+1

'(?!...')'是一個否定[lookahead斷言](http://www.regular-expressions.info/lookaround.html)。 – 2012-02-05 16:39:37

2

您在cont cont ItextI /cont上匹配的原因是,正則表達式匹配第一個「cont」上的cont模式的第一部分,然後它使用不情願的.*?吞噬ItextI之前的空白,下一個連續和空白。當它到達ItextI時,它將I識別爲匹配模式的下一部分,並繼續處理其餘的正則表達式。正如minitech寫道的,這是因爲正則表達式正在從字符串的開頭開始工作,並找到儘可能早的匹配。

如果你能做出空白的假設,你可以寫:

cont\s+I(.*?)I\s+/cont 

這將匹配在你上面的例子。

+0

沒有,也可以是任何東西,不僅空格 經過一番研究在後退正則表達式功能我發現解決方案: (?<= cont)。*?I(。*?)I。*?/ cont 在AS和Java中運行良好 – snowindy 2012-02-05 16:34:21

+0

好的,如果你將來提供了一個更完整的例子,上面的輸入文本有點誤導。 – beerbajay 2012-02-05 16:35:26