我有一个JavaScript正则表达式来匹配字符串中的数字,我将其乘以并替换。
'foo1 bar2.7'.replace(/(\d+\.?\d*)/g, parseInt('$1', 10) * 2);
我希望它返回'foo2 bar5.4'
,但会返回'fooNaN barNaN'
我在这里做错了什么?
答案 0 :(得分:16)
parseInt('$1', 10) * 2
首先执行,其结果传递给replace
。您想使用回调函数:
'foo1 bar2.7'.replace(/(\d+\.?\d*)/g, function(match, number) {
return +number * 2;
});
此外,parseInt
将向下舍入任何浮点值,因此结果为"foo2 bar4"
。相反,您可以使用一元加运算符将任何数字字符串转换为数字。
答案 1 :(得分:1)
您将parseInt('$1', 10) * 2
的结果传递给replace
函数,而不是语句本身。
相反,您可以将函数传递给replace
,如下所示:
'foo1 bar2.7'.replace(/(\d+\.?\d*)/g, function (str) {
return parseInt(str, 10) * 2;
});
有关详细信息,请阅读MDC article关于将函数作为参数传递给String.replace
答案 2 :(得分:0)
请注意,如果您有多个分组,则可以执行以下操作:
"p-622-5350".replace(/p-(\d+)-(\d+)/, function (match, g1, g2) {
return "p-" + (+g1 * 10) + "-" + (+g2 *10);
});
(注意函数中的额外参数)