正则表达式 - 捕获除以“[”开头的句子之外的所有内容
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 正则表达式替换除句子标记、撇号和连字符以外的所有标点符号