regex - 为什么这个多行正则表达式包含以下行?
问题描述
我有以下输入,我想编写一个正则表达式,它将匹配除第一行和最后一行之外的每一行。
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
用简单的英语,我将其描述为:查找带有异常文本的行,然后非贪婪地跟随任何字符(包括换行符),直到我们对日期进行肯定的前瞻。
出于某种原因,这也包括最后一行,即使它不在 regex101 上。我在这里想念什么?
在很多情况下,我只会grep -A
在这样的情况下使用,但问题是正文可以是任意数量的行。
解决方案
它几乎肯定与工具有关。作为“版本 8.12 15-Jan-2011”下 pcregrep 状态的更改日志:
- 在 pcregrep 中,当以文字换行序列结尾的模式在多行模式下匹配时,以下行显示为匹配的一部分。这似乎是错误的,所以我改变了它。
一个简单的解决方法是在前瞻表达式中添加一个换行符,这会将其拉出匹配并阻止最后一行显示:
pcregrep -M ".+Exception sending email[\S\s]+?(?=[\r\n]\d{4}(-\d\d){2})" ~/test.log
推荐阅读
- solidity - 在 ERC721/1155 中更改元数据参数的方法是什么?
- apache-spark - Spark(大型数据集)groupBy,排序,然后映射
- java - 如何使用 Java Spring MongoOperations 执行 mongodb 集合方法?
- facebook-graph-api - API graph instagram 获取 AdCreatives,没有关于 Effective_instagram_story_id 的信息
- django - Django 主从数据同步
- sql - 如何在 case 语句结果中使用 where 子句
- azure-devops - 创建发布管道以同步生产存储库
- scala - 在 Scala 中,如何在不知道输出类型或完整类型参数的情况下调用适用于输入类型的多态函数?
- azure - Azure 数据工厂 - 大型依赖管道
- javascript - 用于列出 javascript 的 Json 字符串