带有字符类量词变量的JavaScript正则表达式
我试图创建一个正则表达式,其中包含一个字符类,该字符类具有一个特定的量词,该量词是一个变量,例如:带有字符类量词变量的JavaScript正则表达式,javascript,regex,variables,replace,quantifiers,Javascript,Regex,Variables,Replace,Quantifiers,我试图创建一个正则表达式,其中包含一个字符类,该字符类具有一个特定的量词,该量词是一个变量,例如: 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
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 == "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"
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"
编辑:为了更清楚,我添加了一个摘要问题,回答如下:
如何从带引号的字符串创建带有插值变量的正则表达式?
虽然我倾向于使用插值,但它似乎不可用(至少在这种情况下),也没有必要
我也试图想出一种方法来实现同样的结果,但在这个用例中却无法做到
作为旁注-我熟悉perl中的这种正则表达式:
my $str = "1234.00";
my $quantifier = 3;
$str =~ s/(\d)(\d{$quantifier}\.)/$1,$2/;
# $str eq "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"
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"
在JavaScript中,不能连接或插入正则表达式文字,但可以使用以下命令从字符串创建正则表达式: 顺便说一下,请注意:
str.replace(..., ...);
没有效果,因为replace
不会修改字符串,而是返回一个包含替换内容的字符串副本。所以你需要写下:
str = str.replace(..., ...);
相反。此语句存在两个问题:
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");
您可以创建一个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
工作示例:
\
,因此\
希望这能有所帮助。您提到的第二个问题基本上包含了您正在寻找的答案。感谢您澄清了字符串与正则表达式对象的关系——如果可以,我将向上投票。上面进行了编辑以使用赋值运算符。感谢您建议转义\字符。这就是我需要的。