JavaScript正则提取浮点数匹配异常,如何正确提取目标值?
问题描述
我编写了以下JavaScript程序:
var rx = /^the values should(?: between (\d+(\.\d+)?) and (\d+(\.\d+)?))$/; var sentence = "the values should between 1.1 and 2.7"; var arr = rx.exec(sentence); console.log(JSON.stringify(arr));
我希望从匹配的语句中提取数值1.1和2.7到数组中。
运行上述程序后得到如下结果:
["the values should between 1.1 and 2.7","1.1",".1","2.7",".7"]
结果中原本的1.1被拆分出.1,2.7被拆分出.7,请问如何在JavaScript中实现正确匹配?
解决方法
出现这个问题的核心原因是正则里用了嵌套捕获组——(\d+(\.\d+)?)里的(\.\d+)是一个独立的捕获组,它会把小数点后的部分单独捕获,所以exec返回的数组里会包含这些额外的匹配结果。
要解决这个问题,只需要把嵌套的捕获组改成非捕获组(用(?:...)包裹),这样就不会把小数点后的部分单独存入结果数组。修改后的代码如下:
var rx = /^the values should(?: between (\d+(?:\.\d+)?) and (\d+(?:\.\d+)?))$/; var sentence = "the values should between 1.1 and 2.7"; var arr = rx.exec(sentence); console.log(JSON.stringify(arr));
运行这段代码后,得到的结果是:
["the values should between 1.1 and 2.7","1.1","2.7"]
如果只需要提取的两个数值,可以直接取数组的第1和第2项,或者用解构赋值快速获取:
const [_, num1, num2] = rx.exec(sentence); console.log(num1, num2); // 输出 1.1 2.7
内容的提问来源于stack exchange,提问作者user51
相关产品推荐
相关产品推荐

