为什么此多行正则表达式包含以下行?

时间:2019-03-13 15:36:59

标签: regex pcre pcregrep

我有以下输入内容,我想编写一个正则表达式,该表达式将匹配除第一行和最后一行之外的每一行。

2019-03-13 00:33:44,846 [INFO] -:  foo
2019-03-13 00:33:45,096 [INFO] -:  Exception sending email
To:
[foo@bar.com, bar@bar.com]
CC:
[baz@bar.com]
Subject:
some subject
Body:
some

body
2019-03-13 00:33:45,190 [INFO] -:  bar

我认为以下内容应能工作,但与任何内容都不匹配:

pcregrep -M ".+Exception sending email[\S\s]+?(?=\d{4}(-\d\d){2})" ~/test.log

简而言之,我将其描述为:寻找带有异常文本的行,然后非贪婪地跟随任何字符(包括换行符),直到我们对日期进行正向查找。

由于某种原因,即使it doesn't on regex101,它也包括最后一行。我在这里想念什么?


在很多情况下,我只会在这种情况下使用grep -A,但问题是主体可以是任意数量的行。

1 个答案:

答案 0 :(得分:2)

几乎可以肯定,这与工具有关。作为pcregrep的changelog状态在“版本8.12 2011年1月15日”下:

  
      
  1. 在pcregrep中,当以文字换行符序列结尾的模式是   在多行模式下匹配时,以下行显示为   比赛。这似乎是错误的,所以我将其更改。
  2.   

一个简单的解决方法是在lookahead表达式内添加换行符,这会将其拉出匹配项并阻止最后一行显示:

pcregrep -M ".+Exception sending email[\S\s]+?(?=[\r\n]\d{4}(-\d\d){2})" ~/test.log