我测试了下面的代码:
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"]
有人可以向我解释那些匹配结果,特别是第一个例子,为什么返回这么多空字符串。第二场比赛,有一个空的字符串重新调整。谢谢。
答案 0 :(得分:4)
(\.\d)*
实际上意味着,匹配组(\.\d)
零次或多次。由于匹配可用零次,因此在每个字符之前,它返回所有零匹配的空字符串。您必须将其更改为(\.\d)+
,这意味着匹配一次或多次组。
如果您确实只想匹配版本号,则可以使用
/\d+(\.\d+)*/
答案 1 :(得分:2)
*
重复前面的标记零次或多次。当您使用全局标志和正则表达式时,除了与模式匹配的字符外,每个字符都会得到一个空字符串作为匹配项。如果删除全局标志,则它仅匹配第一个空字符串,因为正则表达式引擎在第一个匹配后停止匹配。因此,只有在删除g
标志后才能获得一个空字符串作为匹配。
答案 2 :(得分:1)
在第一种情况下,返回空字符串,因为您使用*
量词(0或更多)而不是+
量词(1或更多)。
因此,您的模式可以与空字符串匹配,因此可以多次匹配。请注意,第一次非空匹配之前的结果中的空字符串数为9,直到第一次匹配超过零个字符时的字符数相同。这是因为正则表达式匹配每个位置的空字符串。
答案 3 :(得分:0)
如果你试图捕获数字值,那么这些行应该有用。
(\ d)\ d * *(= [^ \ d] | $)
*可能是一个棘手的野兽。