遵循 From Review 的建議,我打開了一個新的問題執行緒,之前的 Questios 是:在結束特定字母時在匹配后洗掉行。正則運算式(在結束特定字母時洗掉匹配后的行。正則運算式)
我還有另一個問題,如果 NOP 行的前一行以 #/ 開頭并以字母 E 結尾,我是否應該選擇在另一個檔案中復制整個塊結尾
在此示例中為真(NOP 行的前一行以 #/ 開頭并以字母 E 結尾)并且應該選擇所有塊:
- 選擇要在另一個檔案中剪切的整個塊。
- 塊總是以行 SCHEDULE 開始,總是以行 END 結束
- 僅當 NOP 行的上一行以 #/ 開頭并以字母 E 結尾時
塊是:
SCHEDULE MANAGER_XA#KAAABBBR
DESCRIPTION "Added by default."
ON RUNCYCLE KAAABBBR VALIDTO 09/24/2021 $RCG KAAABBBR
:
S89AAAABBB1#/XAAA/XCCCDDDD/KA0EG014
FOLLOWS KABBBCCC3
S89AAAABBB1#/XAAA/XCCCDDDD/KAHHHTTTTTE
NOP
FOLLOWS KABBBCCC3
S89AAAABBB1#/XAAA/XCCCDDDD/KAHHHTTTTTS
NOP
FOLLOWS MANAGER_XA#KZZZDDDD.KGGGHHHHHE
END
但是,可能還有其他 SCHEDULE 塊的作業以字母 E 結尾,但不是 NOP,不應考慮。
SCHEDULE MANAGER_XA#KBBBCCCR
DESCRIPTION "Added by default."
ON RUNCYCLE KAAABBBR VALIDTO 09/24/2021 $RCG KBBBCCCR
:
S89AAAABBB1#/XBBB/XCCCDDDD/KA0EG014
FOLLOWS KABBBCCC3
S89AAAABBB1#/XBBB/XCCCDDDD/KAHHHTTTE
FOLLOWS KABBBCCC3
S89AAAABBB1#/XBBB/XCCCDDDD/KAHHHTTTTTS
NOP
FOLLOWS MANAGER_XA#KZZZDDDD.KGGGHHHHHE
END
使用此代碼搜索行以 #/ 開頭并以字母 E 結尾并洗掉行 NOP(感謝第四只鳥)
^(.*#\/.*E(?:\r?\n(?![^\S\r\n]*NOP$).*)*)\r?\n[^\S\r\n]*NOP$
請任何建議。
謝克
問候。
伊塔洛
編輯更新:
是的,第二個例子沒問題,但是
當它找到匹配項時,它必須選擇它所屬的整個塊,將文本塊復制到另一個檔案。
匹配時為真
S89AAAABBB1#/XAAA/XCCCDDDD/KAHHHTTTTTE
NOP
它應該選擇所有文本塊(開始行 SCHEDULE 結束行結束),這個:
SCHEDULE MANAGER_XA#KAAABBBR
DESCRIPTION "Added by default."
ON RUNCYCLE KAAABBBR VALIDTO 09/24/2021 $RCG KAAABBBR
:
S89AAAABBB1#/XAAA/XCCCDDDD/KA0EG014
FOLLOWS KABBBCCC3
S89AAAABBB1#/XAAA/XCCCDDDD/KAHHHTTTTTE
NOP
FOLLOWS KABBBCCC3
S89AAAABBB1#/XAAA/XCCCDDDD/KAHHHTTTTTS
NOP
FOLLOWS MANAGER_XA#KZZZDDDD.KGGGHHHHHE
END
問候。
伊塔洛
uj5u.com熱心網友回復:
您可以匹配以 SCHEDULE 開頭的行,直到包含#/并結束的第一行E和下一行是NOP
然后繼續匹配所有行,直到匹配為止 END
在匹配程序中,您可以檢查您沒有交叉匹配END,以防止匹配過多。
^SCHEDULE\b.*(?:\n(?!(?:.*#\/.*E|END)$).*)*\r?\n.*#\/.*E\r?\n[^\S\r\n]*NOP(?:\r?\n(?!END$).*)*\r?\nEND$
^字串的開始SCHEDULE\b.*匹配 SCHEDULE 和該行的其余部分(?:非捕獲組\r?\n(?!(?:.*#\/.*E|END)$).*匹配沒有#/并以 E 結尾的行或者是END
)*關閉非捕獲組并可選擇重復,以便它也可以是緊鄰的下一行\r?\n.*#\/.*E匹配具有#/和結尾的行E\r?\n[^\S\r\n]*NOP匹配行NOP(?:\r?\n(?!END$).*)*匹配所有不是的行END\r?\nEND匹配換行符和END$字串結束
正則運算式演示
uj5u.com熱心網友回復:
(?s)^SCHEDULE(?:.(?!^END$))*?#\/[^\r\n]*E\r?\n[ \t]*NOP$.*?^END$
如果在您的正則運算式工具中不起作用(?s)(點匹配也換行),則替換.為(?:.|\s)或任何字符的任何運算式。
請注意,量詞*?是惰性的,以避免從下一個塊(在 END 之后)獲取字符。
Regex101 測驗
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/334564.html
