JavaScript正则表达式和parseInt

11

我有一个用于在字符串中匹配数字的 JavaScript 正则表达式,我想要对其进行乘法运算并替换。

'foo1 bar2.7'.replace(/(\d+\.?\d*)/g, parseInt('$1', 10) * 2);
我希望它返回'foo2 bar5.4',但它返回'fooNaN barNaN'。我做错了什么?
3个回答

17

首先执行parseInt('$1', 10) * 2,并将其结果传递给replace。您需要使用一个回调函数:

'foo1 bar2.7'.replace(/(\d+\.?\d*)/g, function(match, number) {
    return +number * 2;
});

此外,parseInt 会将任何浮点数值向下舍入,因此结果将为 "foo2 bar4"。相反,您可以使用 一元加运算符 将任何数字字符串转换为数字。


嗯..'+number'?为什么要使用'+number',请解释一下,非常感谢。 - 刘伟科
1
应该由最后一句话来解释:"相反,您可以使用一元加运算符将任何数字字符串转换为数字。" - Felix Kling

1

你正在将 parseInt('$1', 10) * 2 的结果传递给 replace 函数,而不是传递语句本身。

相反,你可以像这样向 replace 函数传递一个函数:

'foo1 bar2.7'.replace(/(\d+\.?\d*)/g, function (str) {
    return parseInt(str, 10) * 2;
});

欲获得更多信息,请阅读 MDC文章,了解如何将函数作为参数传递给String.replace


0
请注意,如果您有多个分组,可以进行以下操作:
"p-622-5350".replace(/p-(\d+)-(\d+)/, function (match, g1, g2) { 
    return "p-" + (+g1 * 10) + "-" + (+g2 *10); 
});

(请注意函数中的额外参数)


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接