【问题标题】:Positive & negative lookaheads and quantifiers正负前瞻和量词
【发布时间】:2015-04-23 00:30:17
【问题描述】:

有人可以向我解释为什么这种模式(负前瞻)

/aa.+(?!cc)/g

匹配所有 4 行

aabbcc aabb aabbcc aabb

虽然我预计只有以下 2 行匹配:

aabbcc aabb aabbcc aabb

模式(正向预测):

/aa.+(?=cc)/g

只匹配 2 行:

aabbcc aabb aabbcc aabb

如我所料?

我正在使用 PCRE 风格的 RegEx 引擎。

【问题讨论】:

标签: regex preg-match


【解决方案1】:

正确的负前瞻正则表达式是:

/^aa((?!cc).)+$/gm

RegEx Demo

这将匹配aa 之后的任何内容,只要在行尾之前没有cc

【讨论】:

    【解决方案2】:

    因为.+ 在这个模式中aa.+(?!cc) 匹配所有字符直到结尾。由于在最后一个字符串之后没有字符串 cc,因此此正则表达式匹配上述所有字符串。

    aa(?!.*cc).+
    

    像上面一样修改你的正则表达式以匹配第二行和第四行。 (?!.*cc) 否定前瞻断言不会有字符串 cc 出现在以下将使用 .+ 模式匹配的字符串上。

    DEMO

    【讨论】:

    • 您的解释是:“因为 .+ 在此模式中 aa.+(?!cc) 匹配所有字符直到最后。由于最后一个字符串 cc 不存在,因此正则表达式匹配上述所有字符串。”对我来说是有道理的,但是按照这个逻辑,为什么我的第二个带有正向前瞻的示例会起作用(我们已经匹配了所有字符直到最后,因为在行尾匹配 cc fials 之后没有任何字符)?跨度>
    • @user3925126 请注意,正则表达式引擎总是试图找到匹配项。所以在第一个aa.+(?!cc) 中,它在行尾得到了匹配。因此它会打印出那些匹配的行,其中aa.+(?=cc) 匹配所有字符直到最后一个,因为在最后一个之后没有字符串cc,正则表达式引擎回溯以找到匹配项。所以一开始,它会回溯到一个字符并检查匹配后跟cc,即它匹配aabbc并在此匹配后检查cc。
    • 由于目前只有一个c,所以再回溯一次。现在它匹配aabb,并且有一个匹配,因为aabb后面跟着cc
    • 我不完全理解“由于最后一个字符串 cc 不存在,正则表达式引擎会回溯以找到匹配项”
    • 请解释投反对票的原因。这个答案有什么问题?我清楚地解释了实际发生的事情。
    猜你喜欢
    • 2021-10-11
    • 1970-01-01
    • 2016-07-27
    • 2018-01-20
    • 2022-09-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多