regex - 当找到最后一次出现的单词时,这个正则表达式是如何工作的?

标签 regex

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

foo(?!.*foo)

如果它被喂食 foo bar bar foo ,它将找到最后一次出现的 foo。我知道它使用一种称为负前瞻的机制,这意味着它将匹配一个不以 ?! 后的字符结尾的单词。但是这里的正则表达式是如何工作的?

最佳答案

与 sshashank 的答案略有不同(因为他的回答中的 containing 一词对我不起作用,而在正则表达式中,您必须迂腐——这完全是关于精度。)我 100% 确定 sshashank 知道这一点,并且只将其表述为为简洁起见。

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

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

如果前瞻失败,则对应于 .* 的部分不包含 foo . foo稍后来。

看到这个 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(?!.*foo)/

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)
  • 匹配任何不是换行符的单个字符(换行、回车、下一行、行分隔符、段落分隔符).*
  • 在零次和无限次之间,尽可能多次,按需回馈(贪婪)*
  • 逐字匹配字符串“foo”(区分大小写)foo
  • 关于regex - 当找到最后一次出现的单词时,这个正则表达式是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23751058/

    相关文章:

    python - 如何在 Python 中查找相对 URL 并将其转换为绝对 URL

    mysql - django 过滤器正则表达式在 python 重新工作时不起作用

    java - 仅提取第一次出现的字符以及连字符前后的所有数字

    regex - 从 regexp_matches 中检索结果作为一行

    Javascript 匹配一个正则表达式,但不匹配另一个

    javascript - 当值可选时,如何在 Javascript/jQuery 中将 url 拆分为键值对

    regex - 使用 Vim 将所选内容中每个单词的首字母大写

    Python findall、正则表达式

    regex - 最多只替换一行中的 N 个匹配项

    javascript - 如何使用正则表达式检查字符串是否包含带空格的逗号?