【问题标题】:What's the difference between `/[a-z]??/g` and `/[a-z]?/g`? Will they match a position? [duplicate]`/[a-z]??/g` 和 `/[a-z]?/g` 有什么区别?他们会匹配一个位置吗? [复制]
【发布时间】:2019-11-11 08:26:40
【问题描述】:

以下代码有何不同以及它们是如何工作的?

我正在学习 javascript 中的正则表达式。我对以下代码感到困惑。我想知道它们是如何工作的,以及它们之间的区别。

"abc".replace(/[a-z]??/g, "-")  
// "-a-b-c-"
"abc".match(/[a-z]??/g)
// ["", "", "", ""]

"abc".replace(/[a-z]?/g, "-")
// "----"
"abc".match(/[a-z]?/g);
// ["a", "b", "c", ""]

为什么他们都有四场比赛?第一个替换方法如何在开头和结尾插入-? 为什么第二个只匹配“abc”的结尾而不是开头?

【问题讨论】:

    标签: regex regex-greedy non-greedy


    【解决方案1】:

    量词“?”本身仅表示“匹配零个或前面的字符/字符组之一”。但是,添加第二个“?”使前面的量词变得惰性,匹配尽可能少的字符。这意味着.match() 函数试图完全匹配前面字符组的零,这可能会导致相当奇怪的行为。在这种情况下,它会在每个字符之前和之后检测一个空字符串,这种行为不会立即显现,因此.replace() 会将"-" 字符粘贴在那些空字符串槽中——即每个字符之间。

    但是,如果没有第二个 ?,我们只有普通的 ? 量词,匹配零个或前面的字符/字符组之一。给定字符组[a-z],您的正则表达式会按预期单独匹配每个字母字符——并且在某处也有一个空匹配,因此替换"----"(而不是更直观的"---")。

    【讨论】:

    • 为什么原版 ? 量词的空匹配?我很困惑。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 2013-06-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多