【问题标题】:Regex: Capture Everything between two words that does not have a specific string in the middle正则表达式:捕获中间没有特定字符串的两个单词之间的所有内容
【发布时间】:2023-03-19 20:11:01
【问题描述】:

示例字符串:

蒲公英动物狗是蓝色的

动物猫是蓝色的

酒精动物牛是蓝色的水

我需要使用一个正则表达式来捕获所有以“The”开头并以“blue”结尾的实例,但没有这两个单词之间的单词'cat'。

我尝试了什么:

The.*?(?!cat)blue

期望的结果:

2 匹配:

动物狗是蓝色的

动物牛是蓝色的

任何帮助将不胜感激

【问题讨论】:

  • Theblue之间是否也允许Theblue
  • The(?:(?!cat).)+?blue
  • 在两者之间允许使用单词The,但是捕获应该在单词blue第一次出现时结束
  • the word 似乎在您的所有描述中都很常见。但是,我认为您不知道 word 在您的上下文中是什么。 The cathouse has nice bluepaint,或They concatenate over at bluehorizo​​n,或The cat is not blue。那么,它是什么?

标签: regex


【解决方案1】:

您可以使用字符类 \w(单词字符)\W(非单词字符) 以及单词边界 \b他们之间的比赛。要禁止单词,您只需在单词边界使用否定前瞻(?!...) 测试它们(不跟...)

\bThe\W+(?:(?!cat\b|blue\b)\w+\W+)*blue\b

或使用与 perl 兼容的正则表达式引擎(支持所有格量​​词):

\bThe\W++(?:(?!cat\b|blue\b)\w+\W+)*+blue\b

这样,您可以确定cat 不是scatcatering 的一部分。

【讨论】:

    【解决方案2】:

    ".*" 将匹配所有可以匹配的内容,因此 "(?!cat)" 部分将继续匹配 ".*" 已经匹配 "cat" 之后的任何内容

    我会在匹配“后面跟着蓝色的任何东西”之前包含条件“不匹配后面跟着猫的东西”,如下所示:

    The(?!.*cat).*blue
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-01-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      • 2023-01-10
      相关资源
      最近更新 更多