【问题标题】:Extract text between two words, multi-line with validation提取两个单词之间的文本,带验证的多行
【发布时间】:2021-01-16 08:44:49
【问题描述】:

我正在尝试编写一个正则表达式来识别多行“TYPE”和“ENDS”上的两个单词之间的文本。

TYPE

     words words words

ENDS

但是,如果内容包含特定的单词,例如 BODY,这不应该是有效的匹配。 这是无效的,因为在 TYPE 和 ENDS 之间我们有 BODY

TYPE

     words words words

     BODY <== BAD

     words words words

ENDS

但是,这是有效的,因此“words words words”是所需的输出:

TYPE

     words words words

ENDS

BODY

     more more more

ENDS

目前为止我最好的是:

(\btype\b((?!.[\s\S]*\bbody\b).*)\bends\b)

【问题讨论】:

  • 您忘记发布遇到问题的代码。请阅读How to Askedit 并创建一个minimal reproducible example。此外,还不清楚期望的输出是什么。
  • 嗨 Roko :( 到目前为止我最好的是: (\btype\b((?!.[\s\S]*\bbody\b).*)\bends\b) .

标签: regex


【解决方案1】:

您需要一个否定断言(Lookahead 或 Lookback)。 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)(?&lt;=")(?=BODY").
        • 第一个不允许(. 然后BODY)的组合
        • 第二个允许组合(" 然后BODY"),没有.
        • 第二个中的. 匹配"BODY" 中的B,因此您可以将其替换为B
  • \s*\sENDS\s

结果:regex101

【讨论】:

  • 关于如何接受语音标记中的正文有什么建议吗? TYPE words "body" words ENDS
  • @Matt 为"BODY" 更新了答案。 Sample,你可以删除任何一个引号,它不会匹配。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
相关资源
最近更新 更多