Регулярное выражение Javascript и parseInt

У меня есть регулярное выражение JavaScript для соответствия числам в строке, которые я должен умножать и заменять.

'foo1 bar2.7'.replace(/(\d+\.?\d*)/g, parseInt('$1', 10) * 2);

Я хочу, чтобы он возвращал 'foo2 bar5.4', но он возвращает 'fooNaN barNaN'

Что я здесь делаю неправильно?

Ответ 1

parseInt('$1', 10) * 2 выполняется первым, а его результат передается replace. Вы хотите использовать функцию обратного вызова:

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

Кроме того, parseInt округляет любое значение с плавающей запятой, поэтому результат будет "foo2 bar4". Вместо этого вы можете использовать оператор унарного плюса для преобразования любой числовой строки в число.

Ответ 2

Вы передаете результат parseInt('$1', 10) * 2 функции replace, а не самой инструкции.

Вместо этого вы можете передать функцию replace так:

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

Для получения дополнительной информации прочитайте статью MDC о передаче функций в качестве параметра String.replace

Ответ 3

Обратите внимание, что если у вас более одной группы, вы можете сделать что-то вроде:

"p-622-5350".replace(/p-(\d+)-(\d+)/, function (match, g1, g2) { 
    return "p-" + (+g1 * 10) + "-" + (+g2 *10); 
});

(обратите внимание на дополнительные параметры в функции)