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

Posted

技术标签:

【中文标题】正则表达式 - 捕获除以“[”开头的句子之外的所有内容【英文标题】:REGEX - Capture everything exept the sentence who start with a "[" 【发布时间】:2022-01-13 10:20:54 【问题描述】:

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

示例:

0.32768:0A006832, 4.33024:DD040000 [阶段: CreateMessage]Final-Recipient: rfc822;tXXXXXXXions.croXXXXXy@cXXXXXXXtique.frAction: failedStatus: 5.2.2Diagnostic-Code: smtp;554 5.2.2 邮箱已满;

我想捕捉这样的句子

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

但我不想捕捉

阶段:

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

([A-Z]1[a-z]+\-)?[A-Z]1,3[a-z]*\:\

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

我试过这个:

[^\[]([A-Z]1[a-z]+\-)?[A-Z]1,3[a-z]*\:\

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

有谁知道如何捕捉我的 postmaster 错误?

提前致谢。

(注意:已编辑,我删除了“failedStatus:”并替换为“状态:”)

【问题讨论】:

【参考方案1】:

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

完整答案: (?<!(\[))([A-Z]1[a-z]+\-)?[A-Z]1,3[a-z]*\:\

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

【讨论】:

非常感谢!这不喜欢与我的 SED 一起工作,但可能与某些 PERL 一起工作 命令sed -E -e $'s/(?<!\[)([A-Z]1[a-z]+\-)?[A-Z]1,3[a-z]*\:\ /\\\n\\1/g' File.eml 回复我sed: 1: "s/(?<!A)([A-Z]1[a-z]+ ...": RE error: repetition-operator operand invalid 确认!使用 PERL:perl -pe 's/(?<!\[)(([A-Z]1[a-z]+\-)?[A-Z]1,3[a-z]*\:\ )/\n\1\2/g' 非常感谢!【参考方案2】:

使用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

输出

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

【讨论】:

【参考方案3】:

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

我想捕获这些字段:

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

但不是这个 ONE :-[Stage: ...

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

再次感谢大家的支持!

【讨论】:

以上是关于正则表达式 - 捕获除以“[”开头的句子之外的所有内容的主要内容,如果未能解决你的问题,请参考以下文章

如何使用正则表达式仅捕获具有特定格式的有效句子的第一个单词? [复制]

R 正则表达式替换除句子标记、撇号和连字符以外的所有标点符号

如何使用正则表达式选择除捕获组之外的所有内容?

正则表达式捕获引号内和带/不带空格的数字

捕获从“ NE”开始的正则表达式,后跟61到71之间的任何一位或两位数字

需要一个正则表达式来删除除数字之外的所有内容