`/ [a-z] ?? / g`和`/ [a-z]?/ g`有什么区别?他们会匹配职位吗?

时间:2019-06-30 06:15:40

标签: regex regex-greedy non-greedy

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

我正在学习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", ""]

为什么两个都有四场比赛?第一个replace方法如何在开始和结束处都插入-? 为什么第二个仅匹配结尾而不是“ abc”的开头?

1 个答案:

答案 0 :(得分:0)

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

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