Javascript 为什么它会这样返回匹配
我测试了以下代码:Javascript 为什么它会这样返回匹配,javascript,regex,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) 它给了我: ["", u
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"]
有人能给我解释一下这些匹配结果吗,特别是第一个例子,为什么会返回这么多空字符串。第二个匹配,返回一个空字符串。谢谢。\.\d*实际上意味着,匹配组\.\d零次或多次。由于匹配在每个字符之前都有零次可用,因此它会为所有零匹配返回一个空字符串。您必须将其更改为\.\d+,这意味着要匹配组一次或多次
如果您实际上只想匹配版本号,那么可以使用
/\d+(\.\d+)*/
在第一种情况下,返回空字符串,因为您使用的是*量词0或更多,而不是+量词1或更多
因此,您的模式被允许多次匹配空字符串。请注意,在第一次非空匹配之前的结果中,空字符串的数量为9,在第一次匹配超过零个字符之前,空字符串的数量是相同的。这是因为正则表达式在每个位置匹配空字符串。*将前面的标记重复零次或多次。将全局标志与正则表达式一起使用时,除了与模式匹配的字符外,每个字符都会得到一个空字符串作为匹配项。如果删除全局标志,它将仅在第一次匹配空字符串,因为正则表达式引擎在第一次匹配后停止匹配。因此,在删除g标志后,只有一个空字符串作为匹配项。如果您试图仅捕获数值,那么沿着这些行应该可以工作 \d*\d*?=[^\d]|$ *可能是一只狡猾的野兽。想想看:a*与输入b匹配吗?哪里?相关的