正则表达式:从匹配中排除可选术语

时间:2017-05-18 18:32:58

标签: regex

我正在尝试草拟一个与字符串中第一个:之前的所有内容匹配的正则表达式,并在:之前的文本中排除特定术语(如果找到)。请致电Grumble

我希望匹配字符串Foo中的Foo: Bars

我想在Foo fuzz中匹配Foo fuzz Grumble: Bars and moar bars

我尝试了模式^.*(?=(Grumble)?:)但在上面第二个示例的匹配项中包含了Grumble

2 个答案:

答案 0 :(得分:2)

你需要一个温和的[^:]

^([^:](?!Grumble))*

Live demo

说明:

  • ^断言输入字符串的开头
  • (打开分组
    • [^:]:
    • 以外的任何字符
    • (?!Grumble)后面没有单词Grumble
  • )*尽可能

答案 1 :(得分:1)

怎么样:

^.*?(?=Grumble|:)
  • .*?任何角色的非贪婪匹配
  • (?=Grumble|:)表示具有两个条件的正向前瞻
    • 如果找到Grumble,则只会捕获到Grumble
    • 之前
    • 或如果找到:,则仅在:
    • 之前捕获

Regex101 Demo

编辑:错误解释OP的问题。感谢@revo澄清