查找单词的最后一次出现时,此正则表达式如何工作?

时间:2014-05-20 04:32:42

标签: regex

我遇到了如下的正则表达式:

foo(?!.*foo)

如果它被foo bar bar foo提供,它将找到最后一次出现的foo。我知道它使用了一种叫做负向前瞻的机制,这意味着它将匹配一个不以?后面的字符结尾的单词。!但这里的正则表达式如何运作?

3 个答案:

答案 0 :(得分:9)

sshashank的答案略有不同(因为他的答案中的单词containing对我不起作用,而且在正则表达式中你必须迂腐 - 这完全取决于精确度。)我m 100%肯定sshashank知道这一点,并且只是为了简洁起见。

正则表达式匹配foo,未遵循(即负向前瞻(?!):

{{{任意数量的任何字符(即.*然后字符foo}}}

如果前瞻失败,则与.*对应的部分不会包含 foofoo稍后出现。

请参阅此automatic translation

NODE                     EXPLANATION
--------------------------------------------------------------------------------
  foo                      'foo'
--------------------------------------------------------------------------------
  (?!                      look ahead to see if there is not:
--------------------------------------------------------------------------------
    .*                       any character except \n (0 or more times
                             (matching the most amount possible))
--------------------------------------------------------------------------------
    foo                      'foo'
--------------------------------------------------------------------------------
  )                        end of look-ahead

来自regex101的不同词语相同:

  

/富(?!*富)/

foo matches the characters foo literally (case sensitive)
(?!.*foo) Negative Lookahead - Assert that it is impossible to match the regex below
    .* matches any character (except newline)
        Quantifier: Between zero and unlimited times, as many times as possible, giving back as needed [greedy]
    foo matches the characters foo literally (case sensitive)

RegexBuddy有什么要说的?

富(?!。*富)

foo(?!.*foo)
  • 字面匹配字符串“foo”(区分大小写)foo
  • 断言从这个位置(负向前瞻)(?!.*foo)开始,无法匹配下面的正则表达式
    • 匹配任何不是换行符的单个字符(换行符,回车符,下一行,行分隔符,段落分隔符).*
      • 在零和无限次之间,尽可能多次,根据需要回馈(贪婪)*
    • 字面匹配字符串“foo”(区分大小写)foo

答案 1 :(得分:4)

只有当{em> 后面(foo),其中包含?!的文本(.*)才匹配foo

答案 2 :(得分:4)

否定前瞻是必不可少的,如果您想要匹配其他内容不匹配的内容。

简短说明:

foo(?!.*foo) matches foo when not followed by any character except \n and `foo`

例如,假设您有以下两个字符串。

foobar
barfoo

正则表达式:

foo(?!bar)

如果没有,则匹配foo,因此它会匹配此处的字符串barfoo