带有字符类量词变量的JavaScript正则表达式

时间:2012-02-24 02:59:44

标签: 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{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"

3 个答案:

答案 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

工作示例:

请注意,您需要在字符串中转义\,因此\\

希望这有帮助。