如何编写一个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
1条答案
按热度按时间guykilcj1#
你可以匹配
START
后跟行的其余部分,并匹配以下所有不以开头的行START
的END_OF_MSG
使用负面展望。解释
^
字符串开头START\b.*
匹配开始、单词边界和行的其余部分(?:
非捕获组\R
匹配换行符序列(?!START\b|END_OF_MSG\b).*
如果不是从任何一个备选方案开始,则使用否定的前瞻性匹配整行)*
关闭组并重复0多次以匹配所有行在java中有两个反斜杠
正则表达式演示| java演示