我遇到了如下的正则表达式:
foo(?!.*foo)
如果它被foo bar bar foo
提供,它将找到最后一次出现的foo。我知道它使用了一种叫做负向前瞻的机制,这意味着它将匹配一个不以?后面的字符结尾的单词。!但这里的正则表达式如何运作?
答案 0 :(得分:9)
sshashank的答案略有不同(因为他的答案中的单词containing
对我不起作用,而且在正则表达式中你必须迂腐 - 这完全取决于精确度。)我m 100%肯定sshashank知道这一点,并且只是为了简洁起见。
正则表达式匹配foo
,未遵循(即负向前瞻(?!
):
{{{任意数量的任何字符(即.*
)然后字符foo
}}}
如果前瞻失败,则与.*
对应的部分不会包含 foo
。 foo
稍后出现。
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
答案 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
。