繁体   English   中英

正则表达式 - 捕获除以“[”开头的句子之外的所有内容

[英]REGEX - Capture everything exept the sentence who start with a "["

我从 2 天开始尝试编写一个正则表达式,它从我的邮政主管摘要中捕获一些信息。

示例:

0.32768:0A006832, 4.33024:DD040000 [阶段:CreateMessage]最终收件人:rfc822;tXXXXXXions.croXXXXXy@cXXXXXXtique.frAction: failedStatus: 5.2.2Diagnostic-Code: Z787C75233B93AA5E45CZZZ;5545D13.2邮箱已满;5545D13.2邮箱

我想捕捉这样的句子:

  • 最终收件人:
  • 行动:
  • 失败状态:
  • 诊断代码:
  • 远程 MTA:

但我不想捕捉

  • 阶段:

我写了一个非常适合捕获的正则表达式:

([AZ]{1}[az]+\-)?[AZ]{1,3}[az]*\:\

但遗憾的是,我不知道如何对我的正则表达式说不捕获以“[”开头的句子

我试过这个:

[^\[]([AZ]{1}[az]+\-)?[AZ]{1,3}[az]*\:\

这避免了捕获“[Stage:”,而是在捕获句子之前捕获一个字符。

任何人都知道如何捕获我的邮政主管错误?

提前致谢。

在您的第一个正则表达式之前添加(?<!(\[)) 最终结果将是您想要的。

完整答案: (?<?(\[))([AZ]{1}[az]+\-),[AZ]{1:3}[az]*\:\

解释:你想防止在你的短语之前有[元素,在正则表达式中是(\[)并且你不想在短语之前没有它,这意味着你想使用not equal lookBehind 在正则表达式中?<是lookBehind 和! 不是。 所以你需要的是?<!(\[)

使用sed ,您可以将捕获组用于匹配除]之外的任何字符的第一部分,并将另一个组用于整个最后一部分,包括内部的可选捕获组。

在组 1 和组 2 之间使用换行符替换\1\n\2

请注意,您的模式与failedStatus:不匹配,因为它不以大写字母开头。

你也可以省略这个量词{1}因为 1 是默认值,你不必转义\-\:\

sed -E 's/([^\[])(([A-Z][a-z]+-)?[A-Z]{1,3}[a-z]*: )/\1\n\2/g' File.eml

Output

0.32768:0A006832, 4.33024:DD040000 [Stage: CreateMessage]
Final-Recipient: rfc822;tXXXXXXXions.croXXXXXy@cXXXXXXXtique.fr
Action: failed
Status: 5.2.2

我的错! 我在原来的问题中犯了一个错误!

我想捕获这个字段:

最终收件人:操作:状态:诊断代码:远程 MTA:

但不是这个 ONE:[阶段:...

所以来自 ghazal khaki 的正则表达式是正确的并且工作正常!

再次感谢小伙伴们的支持!

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM