select 如果匹配特定行,则阻止文本,正则表达式

select block text if match specific line, regex

按照 From Review 的建议,我打开了一个新的问题线程,之前的问题是:(在结束特定字母时删除匹配后的行。正则表达式)

我还有另一个问题,如果 NOP 行的前一行以#/ 开头并以字母 E 结尾,我是否应该 select 将整个块复制到另一个文件中,该块始终是从 SCHEDULE 行开始,总是以 END

行结束

在此示例中为真(NOP 行的前一行以#/ 开头并以字母 E 结尾)并且应该 select 全部块:

块是:

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
  • $ 字符串结束

Regex demo

(?s)^SCHEDULE(?:.(?!^END$))*?#\/[^\r\n]*E\r?\n[ \t]*NOP$.*?^END$

如果您的正则表达式工具不起作用 (?s)(点也匹配换行符),则将 . 替换为 (?:.|\s) 任何字符的任何表达式.

请注意量词 *? 被强制执行 lazy 以避免从下一个块(END 之后)获取字符。

Regex101 test