2012-05-11 23 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

它在我的情况并没有很好的工作,但这两个答案帮助我了解更多关于正则表达式。谢谢! –