我试图编写一个正则表达式来识别多行“ TYPE”和“ ENDS”两个单词之间的文本。
TYPE
words words words
ENDS
但是,如果内容包含特定单词(例如BODY),则该单词不应为有效匹配。这是无效的,因为在TYPE和ENDS之间,我们有BODY
TYPE
words words words
BODY <== BAD
words words words
ENDS
但是,这是有效的,因此“单词单词words”是所需的输出:
TYPE
words words words
ENDS
BODY
more more more
ENDS
到目前为止,我最好的是:
(\btype\b((?!.[\s\S]*\bbody\b).*)\bends\b)
您需要一个否定断言(前瞻性或回溯性)。regular-expressions.info
这是一个示例:regex101
TYPE\n(((?!BODY).)*)\nENDS
该(?!BODY)
如果内容不匹配匹配BODY
。
((?!BODY).)*
与匹配.*
,并且每个字符BODY
前面都没有前缀。
请注意,正则表达式启用SingleLine,也.
可以匹配换行符,它与MultiLine不冲突。
如果您不想使用单行模式和单词边界,请尝试以下一种:regex101
\bTYPE\b\s*(((?!\bBODY\b)(.|\s))*?)\s*\sENDS\s
基本上相同,但只是手动匹配\s
,并且带有\b
左右单词。
编辑:
旧的正则表达式是
\bTYPE\b\s*
(
... )
(
... )*?
(?!\bBODY\b)(.|\s)
\s*\sENDS\s
为了允许引用版本,您可以在其中添加
\bTYPE\b\s*
(
... )
(
... )*?
(?!\bBODY\b)(.|\s)
要么 (?<=")(?=BODY").
.
然后BODY
)的组合"
然后BODY"
)的组合,没有.
。.
第二场比赛B
中"BODY"
,这样你就可以取代它B
。\s*\sENDS\s
结果:regex101
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句