select 如果匹配特定行,则阻止文本,正则表达式
select block text if match specific line, regex
按照 From Review 的建议,我打开了一个新的问题线程,之前的问题是:(在结束特定字母时删除匹配后的行。正则表达式)
我还有另一个问题,如果 NOP 行的前一行以#/ 开头并以字母 E 结尾,我是否应该 select 将整个块复制到另一个文件中,该块始终是从 SCHEDULE 行开始,总是以 END
行结束
在此示例中为真(NOP 行的前一行以#/ 开头并以字母 E 结尾)并且应该 select 全部块:
- select 将整个块剪切到另一个文件中。
- 该块始终以 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$
有什么建议吗
谢谢
此致。
意大利
编辑更新:
是的,第二个例子没问题,但是
找到匹配项后,它必须select将它所属的整个块复制到另一个文件。
当匹配为真时
S89AAAABBB1#/XAAA/XCCCDDDD/KAHHHTTTTTE
NOP
它应该 select 所有文本块(开始行 SCHEDULE 结束行 END),这个:
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
然后继续匹配所有行,直到匹配到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
$
字符串结束
(?s)^SCHEDULE(?:.(?!^END$))*?#\/[^\r\n]*E\r?\n[ \t]*NOP$.*?^END$
如果您的正则表达式工具不起作用 (?s)
(点也匹配换行符),则将 .
替换为 (?:.|\s)
或 任何字符的任何表达式.
请注意量词 *?
被强制执行 lazy 以避免从下一个块(END 之后)获取字符。
按照 From Review 的建议,我打开了一个新的问题线程,之前的问题是:
我还有另一个问题,如果 NOP 行的前一行以#/ 开头并以字母 E 结尾,我是否应该 select 将整个块复制到另一个文件中,该块始终是从 SCHEDULE 行开始,总是以 END
行结束在此示例中为真(NOP 行的前一行以#/ 开头并以字母 E 结尾)并且应该 select 全部块:
- select 将整个块剪切到另一个文件中。
- 该块始终以 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$
有什么建议吗
谢谢
此致。
意大利
编辑更新:
是的,第二个例子没问题,但是
找到匹配项后,它必须select将它所属的整个块复制到另一个文件。
当匹配为真时
S89AAAABBB1#/XAAA/XCCCDDDD/KAHHHTTTTTE
NOP
它应该 select 所有文本块(开始行 SCHEDULE 结束行 END),这个:
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
然后继续匹配所有行,直到匹配到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
$
字符串结束
(?s)^SCHEDULE(?:.(?!^END$))*?#\/[^\r\n]*E\r?\n[ \t]*NOP$.*?^END$
如果您的正则表达式工具不起作用 (?s)
(点也匹配换行符),则将 .
替换为 (?:.|\s)
或 任何字符的任何表达式.
请注意量词 *?
被强制执行 lazy 以避免从下一个块(END 之后)获取字符。