使用以下正则表达式:
\[\w* \w* \d{2} [\w:]* \d{4}\] \[error\] \[client .*?\] .*? Using HTTP not .*?<br />
我得到以下结果(黄色方框表示匹配):
原始文字: http://pastebin.com/vSi0mLGv
底部的两个部分是正确的。我想要包含以下内容的所有部分:<<<NOTICE>>> 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 :(得分: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 />).)*
这样的东西可能有效。