'/[a-z]有什么区别?/g' 和 '/[a-z]?/g'?他们会匹配一个位置吗?



以下代码有何不同以及它们的工作方式?

我正在学习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"的开头匹配?

量词'?本身只是指"匹配零或前面的字符/角色组之一"。但是,添加第二个"?"使前面的量词懒惰,与之匹配的字符尽可能少。这意味着.match()函数试图匹配上述字符组的零,这可能会导致相当时髦的行为。在这种情况下,它在每个字符之前和之后都检测一个空字符串,这种行为并不明显,因此.replace()会将"-"字符粘贴在那些空字符串插槽中,即在每个字符之间。

但是,如果没有第二个?,我们只有Vanilla ?量词,匹配零或前一个字符/角色组之一。给定字符组[a-z],您的正则态度可以像预期的那样与每个字母顺序匹配 - 并且在某处也有一个空匹配,因此替换"----"(而不是更直观的"---"(。

最新更新