【问题标题】:Regex for matching something if it is not preceded by something else如果前面没有其他内容,则用于匹配某些内容的正则表达式
【发布时间】:2012-03-07 13:13:58
【问题描述】:

使用 Java 中的正则表达式,我想编写一个正则表达式,当且仅当模式前面没有某些字符时才会匹配。例如:

String s = "foobar barbar beachbar crowbar bar ";

如果 bar 前面没有 foo,我想匹配。所以输出将是:

barbar
beachbar
crowbar
bar

【问题讨论】:

    标签: java regex


    【解决方案1】:

    另一种选择是首先匹配可选的单词字符,然后是bar,当匹配时,检查左边的不是foobar

    lookbehind 断言将在首先匹配bar 之后运行。

    \w*bar(?<!foobar)
    
    • \w* 匹配 0+ 个单词字符
    • bar 字面匹配
    • (?&lt;!foobar) 负向后视,从当前位置断言 foobar 不是直接向左。

    Regex demo

    【讨论】:

      【解决方案2】:

      你想像这样使用negative lookbehind

      \w*(?<!foo)bar
      

      其中(?&lt;!x) 的意思是“仅当它在此点之前没有“x”时”。

      更多信息请参见Regular Expressions - Lookaround

      编辑:添加\w* 以捕获之前的字符(例如“海滩”)。

      【讨论】:

      • 需要进行哪些修改才能与 foo_arbitrary_bar 不匹配?即 foo 不在 bar 之前
      • @BradKent (?&lt;!foo).*bar 会匹配这样的东西,我相信。
      • @emyller 不。这将匹配 foobazbar(foo 不在 foobazbar 之前,所以它匹配)
      • @BradKent 我没有在“不匹配”中读到你的“不”,这就是为什么我说它会匹配。你的情况在我看来就像\b(?!foo)\w*bar\b
      • @BradKent 然后,您可以提出一个新问题,详细说明您想要实现的目标,或者继续使用正则表达式,直到您自己找到它。 :)
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-12-23
      • 1970-01-01
      • 2012-12-05
      • 1970-01-01
      • 2011-04-13
      相关资源
      最近更新 更多