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

问题描述 投票:2回答:1

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

2019-03-13 00:33:44,846 [INFO] -:  foo
2019-03-13 00:33:45,096 [INFO] -:  Exception sending email
To:
[[email protected], [email protected]]
CC:
[[email protected]]
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,但问题是身体可能是任意数量的线。

regex pcre pcregrep
1个回答
2
投票

它几乎肯定与该工具有关。作为pcregrep的changelog在“版本8.12 15-Jan-2011”下声明:

  1. 在pcregrep中,当以多行模式匹配以文字换行序列结束的模式时,以下行显示为匹配的一部分。这似乎是错的,所以我改变了它。

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

pcregrep -M ".+Exception sending email[\S\s]+?(?=[\r\n]\d{4}(-\d\d){2})" ~/test.log
© www.soinside.com 2019 - 2024. All rights reserved.