我正在尝试创建一个具有特定量词的字符类的正则表达式,该量词是一个变量,例如:
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"
编辑:为了更清楚,我添加了一个总结问题,答案如下:如何使用带引号的字符串中的插值变量创建正则表达式
尽管我倾向于使用插值,但这似乎不可用(至少在这种情况下),也没有必要。
我还试图想出一种方法来连接/连接一些regex文本以获得相同的结果,但在本用例中无法做到这一点。
顺便说一句,我熟悉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"
此语句存在两个问题:
str.replace("(d)(d{3}.)","$1,$2");
第一种是传递一个字符串,而不是正则表达式对象,第二种是在字符串文字中,反斜杠具有特殊的含义来转义某些内容(例如,"n"
是换行符),因此要在字符串文字中将实际的反斜杠加倍为"\"
。使用RegExp()
构造函数从字符串中创建regex对象,您可以得到以下内容:
str.replace(new RegExp("(\d)(\d{3}\.)"),"$1,$2");
因此,从那里你可以做到:
var quantifier = 3
str = str.replace(new RegExp("(\d)(\d{" + quantifier + "}\.)"),"$1,$2");
在JavaScript中,您不能连接或插入regex文本,但您可以使用RegExp
构造函数从字符串创建regex:
str = str.replace(new RegExp('(\d)(\d{' + quantifier + '}\.'), "$1,$2");
顺便注意一下,这个:
str.replace(..., ...);
无效,因为replace
不修改字符串,而是返回一个替换字符串的副本。所以你需要写这个:
str = str.replace(..., ...);
相反。
您可以创建一个RegExp对象:
var str = "1234.00";
var digits = 2;
var re = new RegExp("(\d)(\d{" + digits + "})");
var str2 = str.replace(re,"$1,$2-");
CCD_ 6将包含CCD_。
工作示例:
- http://jsfiddle.net/JuZtc/
请注意,您需要在字符串中转义,从而转义
\
。
希望这能有所帮助。