提取两个单词之间的文本,多行验证

马特

我试图编写一个正则表达式来识别多行“ 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)
SGKoishi

您需要一个否定断言(前瞻性或回溯性)。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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章