2012-05-11 50 views
1

使用後續的正則表達式:在大正則表達式使用惰性計算(不只是*?)

\[\w* \w* \d{2} [\w:]* \d{4}\] \[error\] \[client .*?\] .*? Using HTTP not .*?<br /> 

我得到的結果如下(其中黃色框指示匹配):

Sublime Text 2

原始文本:http://pastebin.com/vSi0mLGv

底部的兩個部分是correc噸。我想包含所有部分:&lt;&lt;&lt;NOTICE&gt;&gt;&gt; Non-Prod Server: Using HTTP not HTTP/S

的頂部然而,包含正確的字符串(類似於底部的兩個),而且還附帶了一個整體的其他塊,我不想:

[Thu May 10 17:43:48 2012] [error] [client ::1] Current Name: 
DashboardBar_projAnnualReview200, referer: http:// 
localhost/test/pages/TestPage.php<br />` 

我知道這歸結爲正則表達式是貪婪的,但我怎麼能讓它做一個<br />的懶惰評估,如果這是正確的方式去做。我試過(<br />)*?等人無濟於事。


其他信息: 我使用Sublime Text 2,並執行正則表達式搜索,如果有人想重新創建圖像。

+0

只是FYI,[懶惰評價](http://en.wikipedia.org/wiki/Lazy_evaluation)與正則表達式無關。 「懶惰」一詞早期用於描述正則表達式量詞的非貪婪變體,這是一個錯誤。 「非貪婪」對他們來說是一個更好的詞,「不情願」更準確。 –

回答

4

貪婪不是問題,渴望是。正則表達式引擎開始嘗試儘早匹配,並且在每個可能性已經耗盡之前它不會放棄。量詞不貪婪並不會改變它,它只是改變嘗試可能性的順序。

這不是*.*這是造成你的問題,它是.。你需要使用更多限制性的東西,因爲這會讓比賽開始得太早。此正則表達式可以作爲理想的,因爲我已經取代了.*?[^][]*,它匹配除了][任何字符:

\[\w* \w* \d{2} [\w:]* \d{4}\] \[error\] \[client [^][]*\] [^][]* Using HTTP not .*?<br /> 

我不知道味道SublimeText使用正則表達式是什麼,所以你可能需要躲避方字符類內的括號:

\[\w* \w* \d{2} [\w:]* \d{4}\] \[error\] \[client [^\]\[]*\] [^\]\[]* Using HTTP not .*?<br /> 
2

你的意思是「不情願」,而不是「懶惰」。

不應該介入<br />,對不對?像((?!<br />).)*可能工作。

+0

是的,這也適用。這將替換原始正則表達式中的'。*?',就像我用'[^] [] *'做的一樣。 –

+0

它在我的情況並沒有很好的工作,但這兩個答案幫助我瞭解更多關於正則表達式。謝謝! –