为什么它会像那样返回匹配

时间:2014-10-01 17:47:07

标签: javascript regex

我测试了下面的代码:

var str1 = 'chapter 4.5.3.1'
var rslt = str1.match(/(\.\d)*/g)
console.log(rslt)

并返回

的匹配项
["", "", "", "", "", "", "", "", "", ".5.3.1", ""] 

如果我去

var str1 = 'chapter 4.5.3.1'
var rslt = str1.match(/(\.\d)*/)
console.log(rslt)

它给了我:

["", undefined, index: 0, input: "chapter 4.5.3.1"] 

有人可以向我解释那些匹配结果,特别是第一个例子,为什么返回这么多空字符串。第二场比赛,有一个空的字符串重新调整。谢谢。

4 个答案:

答案 0 :(得分:4)

(\.\d)*实际上意味着,匹配组(\.\d) 零次或多次。由于匹配可用零次,因此在每个字符之前,它返回所有零匹配的空字符串。您必须将其更改为(\.\d)+,这意味着匹配一次或多次组。

如果您确实只想匹配版本号,则可以使用

/\d+(\.\d+)*/

答案 1 :(得分:2)

*重复前面的标记零次或多次。当您使用全局标志和正则表达式时,除了与模式匹配的字符外,每个字符都会得到一个空字符串作为匹配项。如果删除全局标志,则它仅匹配第一个空字符串,因为正则表达式引擎在第一个匹配后停止匹配。因此,只有在删除g标志后才能获得一个空字符串作为匹配。

答案 2 :(得分:1)

在第一种情况下,返回空字符串,因为您使用*量词(0或更多)而不是+量词(1或更多)。

因此,您的模式可以与空字符串匹配,因此可以多次匹配。请注意,第一次非空匹配之前的结果中的空字符串数为9,直到第一次匹配超过零个字符时的字符数相同。这是因为正则表达式匹配每个位置的空字符串。

答案 3 :(得分:0)

如果你试图捕获数字值,那么这些行应该有用。

(\ d)

\ d * *(= [^ \ d] | $)

*可能是一个棘手的野兽。