【问题标题】:JavaScript Regular Expression with character class quantifier variable [duplicate]带有字符类量词变量的JavaScript正则表达式[重复]
【发布时间】:2012-02-24 02:59:44
【问题描述】:

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

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"

【问题讨论】:

  • 你所指的第二个问题基本上包含了你要找的答案。

标签: javascript regex variables replace quantifiers


【解决方案1】:

这种说法有两个问题:

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】:

在 JavaScript 中,您不能连接或插入正则表达式文字,但是您可以使用 the RegExp constructor 从字符串创建正则表达式:

str = str.replace(new RegExp('(\\d)(\\d{' + quantifier + '}\\.'), "$1,$2");

顺便说一句,请注意:

str.replace(..., ...);

没有任何效果,因为replace 不会修改字符串,而是返回带有替换的字符串副本。所以你需要这样写:

str = str.replace(..., ...);

改为。

【讨论】:

  • 在上面编辑以使用赋值运算符。
【解决方案3】:

你可以创建一个 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

工作示例:

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

希望这会有所帮助。

【讨论】:

  • 感谢您建议转义 \ 字符。这正是我所需要的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 2012-11-20
  • 1970-01-01
  • 2015-03-02
  • 1970-01-01
  • 2017-11-04
相关资源
最近更新 更多