以下代码有何不同以及它们的工作方式?
我正在学习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]
,您的正则态度可以像预期的那样与每个字母顺序匹配 - 并且在某处也有一个空匹配,因此替换"----"
(而不是更直观的"---"
(。