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



我正在尝试创建一个具有特定量词的字符类的正则表达式,该量词是一个变量,例如:

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/

请注意,您需要在字符串中转义,从而转义\

希望这能有所帮助。

相关内容

  • 没有找到相关文章

最新更新