我正在尝试使用具有特定量词的字符类创建正则表达式,该量词是一个变量,例如:
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"
但是它与quoted pattern instead of a slash-delimited pattern的功能不同,如下所示:
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"
编辑:为了更清楚,我添加了一个摘要问题,答案如下: 如何使用带引号的字符串中的插值变量创建正则表达式?
虽然我倾向于使用插值,但似乎不可用(至少在此上下文中),并且没有必要。
我也试图找到一种方法concatenate/join some regex literals来获得相同的结果,但是对于这个用例却无法这样做。
作为旁注 - 我熟悉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"
答案 0 :(得分:0)
在JavaScript中,您无法连接或插入到正则表达式文字中,但您可以使用the RegExp
constructor从字符串创建正则表达式:
str = str.replace(new RegExp('(\\d)(\\d{' + quantifier + '}\\.'), "$1,$2");
顺便提一下,请注意:
str.replace(..., ...);
无效,因为replace
不修改字符串,而是返回带有替换字符串的字符串副本。所以你需要写这个:
str = str.replace(..., ...);
代替。
答案 1 :(得分:0)
此声明存在两个问题:
str.replace("(\d)(\d{3}\.)","$1,$2");
第一个是传递字符串而不是正则表达式对象,第二个是在字符串文字中反斜杠具有特殊含义以逃避某些事情(例如,"\n"
是换行符)因此,要在字符串文字中加上实际的反斜杠,您需要将其加倍"\\"
。使用RegExp()
构造函数从字符串创建一个正则表达式对象,你得到这个:
str.replace(new RegExp("(\\d)(\\d{3}\\.)"),"$1,$2");
所以你可以这样做:
var quantifier = 3
str = str.replace(new RegExp("(\\d)(\\d{" + quantifier + "}\\.)"),"$1,$2");
答案 2 :(得分:0)
您可以创建一个RegExp对象:
var str = "1234.00";
var digits = 2;
var re = new RegExp("(\\d)(\\d{" + digits + "})");
var str2 = str.replace(re,"$1,$2-");
str2
将包含1,23-4.00
。
工作示例:
请注意,您需要在字符串中转义\
,因此\\
。
希望这有帮助。