我從 2 天開始嘗試撰寫一個 Regex,它從我的 postmaster 摘要中捕獲一些資訊。
例子:
0.32768:0A006832, 4.33024:DD040000 [階段: CreateMessage]Final-Recipient: rfc822;[email protected]: failedStatus: 5.2.2Diagnostic-Code:5.5s2tm
我想捕捉這樣的句子:
- 最終收件人:
- 行動:
- 失敗狀態:
- 診斷代碼:
- 遠程 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 錯誤?
提前致謝。
uj5u.com熱心網友回復:
(?<!(\[))在您的第一個正則運算式之前添加。最終結果將是您想要的。
完整答案:
(?<!(\[))([A-Z]{1}[a-z] \-)?[A-Z]{1,3}[a-z]*\:\
解釋:你想防止[在正則運算式中的短語之前有元素,(\[)并且你想在短語之前沒有它,這意味著你想使用not equal lookBehind. 在正則運算式中?<是lookBehind 而!不是。所以你需要的是?<!(\[)
uj5u.com熱心網友回復:
使用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;[email protected]
Action: failed
Status: 5.2.2
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/377190.html
