对大型正则表达式使用延迟评估(而不仅仅是。*?)

时间:2012-05-11 03:05:42

标签: php regex reluctant-quantifiers

使用以下正则表达式:

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

我得到以下结果(黄色方框表示匹配):

Sublime Text 2

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

底部的两个部分是正确的。我想要包含以下内容的所有部分:&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,并且如果有人想要重新创建图像,则执行正则表达式搜索。

2 个答案:

答案 0 :(得分:4)

贪婪不是问题,渴望。正则表达式引擎开始尝试尽早匹配,并且在每种可能性都用尽之前它不会放弃。使量词非贪婪不会改变它,它只会改变尝试可能性的顺序。

*中的.*导致您的问题,而不是..*?。你需要使用更具限制性的东西,因为它允许比赛过早开始。这个正则表达式可以正常工作,因为我已将[^][]*替换为],其匹配除[\[\w* \w* \d{2} [\w:]* \d{4}\] \[error\] \[client [^][]*\] [^][]* Using HTTP not .*?<br /> 以外的任何字符:

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

我不知道SublimeText使用什么样的正则表达式,所以你可能需要转义字符类中的方括号:

{{1}}

答案 1 :(得分:2)

你的意思是“不情愿”,而不是“懒惰”。

应该没有干预<br />,对吧?像((?!<br />).)*这样的东西可能有效。