regexp匹配从标识符到结束标识符的多行部分

kokeuurv  于 2021-07-03  发布在  Java
关注(0)|答案(1)|浏览(406)

如何编写一个regexp,它将匹配以给定标识符开头(直到接收到消息结尾关键字)的所有多行部分(行数不同)。
示例-我想从给定的文本块中提取从关键字“start”开始直到“end\u of \u 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

我想让regexp生成三个部分:

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

到目前为止,我已经计算出了一个regexp,它似乎几乎正确地做到了这一点

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

问题是,最后一节还包括我想跳过的消息标识符的结尾。我还认为这个regexp看起来并不是获取这些部分的最佳方式。关于如何改进这个有什么想法吗?
此处提供的示例:regex101

guykilcj

guykilcj1#

你可以匹配 START 后跟行的其余部分,并匹配以下所有不以开头的行 STARTEND_OF_MSG 使用负面展望。

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

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

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

正则表达式演示| java演示

相关问题