正则表达式以匹配从标识符开始到结束标识符的多行部分
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_MSG
的 START
开头的所有后续行。
^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).*)*
如何编写一个正则表达式来匹配以给定标识符开头的所有多行部分(具有不同行数)(直到收到消息结尾关键字)。
示例 - 我想从给定的文本块中提取所有以关键字 '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_MSG
的 START
开头的所有后续行。
^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).*)*