Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/109.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex 为什么这个多行正则表达式包含以下行?_Regex_Pcre_Pcregrep - Fatal编程技术网

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

Regex 为什么这个多行正则表达式包含以下行?,regex,pcre,pcregrep,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 [I

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

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
用通俗易懂的英语,我会这样描述:寻找一行带有异常文本的行,后跟任何字符(包括换行符),不贪婪地,直到我们找到一个积极的日期前瞻

出于某种原因,这也包括最后一行,即使。我错过了什么



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

这几乎肯定与工具有关。正如pcregrep在“2011年1月15日8.12版”中所述:

  • 在pcregrep中,当以文字换行序列结尾的模式 在多行模式下匹配,以下行显示为 匹配。这似乎是错误的,所以我改变了它
  • 一个简单的修复方法是在lookahead表达式中添加一个换行符,这将使其退出匹配,并阻止最后一行显示:

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

    尝试:[\S\S]+而不是[.\S]+-该点在括号内时是一个文字点。它在regex101上工作,因为regex选项
    gm
    也。。。如果在你的邮件正文中有一行以日期开头呢?@JorgeCampos我有多行标志,但全局标志在概念上并不适用于*grep,对吗?是的,我已经考虑过了。电子邮件的内容在实践中是不会发生的。可以安全地忽略它。我根据您的输入测试了您的正则表达式,它确实在我的Debian设置中返回了预期结果(
    pcregrep版本8.39 2016-06-14
    )。您是否使用此精确输入进行测试?@CoffeeNinja是的,输入与此处列出的相同。版本稍旧,但我无权更改:
    pcregrep版本7.8 2008-09-05
    聪明!谢谢。谢谢。