Я пытаюсь создать регулярное выражение с классом символов, который имеет определенный квантификатор, который является переменной, например:
var str = "1234.00";
var quantifier = 3;
str = str.replace(/(\d)(\d{quantifier}\.)/,"$1,$2");
//str should be "1,234.00"
Это работает следующим образом (без переменной):
var str = "1234.00";
str = str.replace(/(\d)(\d{3}\.)/,"$1,$2");
//str == "1,234.00"
Однако он не имеет такой же функциональности с шаблоном в кавычках вместо шаблона, разделенного косой чертой следующим образом:
var str = "1234.00";
str = str.replace("(\d)(\d{3}\.)","$1,$2");
//str == "1234.00" - not "1,234.00"
//quote symbol choice does not change this
str = str.replace('(\d)(\d{3}\.)',"$1,$2");
//str == "1234.00" - not "1,234.00"
редактировать: чтобы быть более ясным, я добавил итоговый вопрос, на который был дан ответ ниже: Как мне создать регулярное выражение с интерполированной переменной из строки в кавычках?
Хотя я бы предпочел использовать интерполяцию, кажется, что она недоступна (по крайней мере, в этом контексте) и не нужна.
Я также попытался придумать способ объединить/присоединить некоторые регулярные выражения литералы для достижения того же результата, но не смогли этого сделать для этого варианта использования.
В качестве примечания - я знаком с этим типом регулярных выражений в Perl:
my $str = "1234.00";
my $quantifier = 3;
$str =~ s/(\d)(\d{$quantifier}\.)/$1,$2/;
# $str eq "1,234.00"
Что можно сделать полезным следующим образом:
my $str = "1234567890.00";
for my $quantifier (qw(9 6 3)) {
$str =~ s/(\d)(\d{$quantifier}\.)/$1,$2/;
}
# $str eq "1,234,567,890.00"
С учетом предоставленных предложений и ответов я создал образец строки валюты следующим образом:
String.prototype.toCurrency = function() {
var copy = parseFloat(this).toFixed(2);
for (var times = parseInt(copy.length/3); times > 0; times--) {
var digits = times * 3;
var re = new RegExp("(\\d)(\\d{" + digits + "}\\.)");
copy = copy.replace(re,"$1,$2");
}
return '$'+copy;
};
str = "1234567890";
str.toCurrency();
// returns "$1,234,567,890.00"