Регулярное выражение 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);
});
(обратите внимание на дополнительные параметры в функции)