正则表达式以匹配从标识符开始到结束标识符的多行部分

Regexp to match multiline sections starting with identifier up to an end identifier

如何编写一个正则表达式来匹配以给定标识符开头的所有多行部分(具有不同行数)(直到收到消息结尾关键字)。

示例 - 我想从给定的文本块中提取所有以关键字 'START' 开头直到 'END_OF_MSG' 的部分:

HELLO
START ABC DEF GHI JKL
QWER RANDOM TEXT 213%@#!
UIOP RANDOMZXCVB123456
START ABC DEF GHI JKL
ZZZZZ RANDOMTEXT213%@#!
11111 RANDOMZXCVB123456
$$$$$$ SOMEMORETEXT
START ABC DEF GHI JKL
QWER RANDOMTEXT213%@#!
$$$$$ RANDOMZXCVB123456
END_OF_MSG

我希望正则表达式生成三个部分:

START ABC DEF GHI JKL
QWER RANDOM TEXT 213%@#!
UIOP RANDOMZXCVB123456
START ABC DEF GHI JKL
ZZZZZ RANDOMTEXT213%@#!
11111 RANDOMZXCVB123456
$$$$$$ SOMEMORETEXT
START ABC DEF GHI JKL
QWER RANDOMTEXT213%@#!
$$$$$ RANDOMZXCVB123456

到目前为止,我已经制定了一个正则表达式,它似乎几乎正确

(?m)^START(.|\n)*?((?=^START)|END_OF_MSG)

问题是,最后一部分还包含我想跳过的 END_OF_MSG 标识符。 我还认为这个正则表达式看起来不像是获取这些部分的最佳方式。关于如何改进这一点有什么想法吗?

此处提供示例:Regex101

您可以匹配 START 后跟该行的其余部分,并使用否定先行匹配不以 END_OF_MSGSTART 开头的所有后续行。

^START\b.*(?:\R(?!START\b|END_OF_MSG\b).*)*

说明

  • ^ 字符串开头
  • START\b.* 匹配 START、单词边界和行的其余部分
  • (?:非捕获组
    • \R匹配一个换行序列
    • (?!START\b|END_OF_MSG\b).* 匹配整行,如果它不是以任何使用否定前瞻的备选方案开始的话
  • )* 关闭组并重复0+次以匹配所有行

在 Java 中带有双反斜杠

^START\b.*(?:\R(?!START\b|END_OF_MSG\b).*)*

Regex demo | Java demo