-1

変数である特定の数量詞を持つ文字クラスで正規表現を作成しようとしています。例:

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"

編集:より明確にするために、以下に回答した要約質問を追加しました: 引用符で囲まれた文字列から補間変数を使用して正規表現を作成するにはどうすればよいですか?

私の好みは補間を使用することですが、(少なくともこのコンテキストでは)利用できないようであり、必要ありません。

また、同じ結果を達成するためにいくつかの正規表現リテラルを連結/結合する方法を考え出そうとしましたが、このユースケースではそうすることができませんでした。

補足として-私は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"
4

3 に答える 3

0

JavaScriptでは、正規表現リテラルに連結または補間することはできませんがコンストラクRegExpターを使用して文字列から正規表現を作成できます。

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

ちなみに、これは次のことに注意してください。

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

文字列を変更しないため、効果はありreplaceませんが、置換が行われた文字列のコピーを返します。したがって、これを書く必要があります:

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

代わりは。

于 2012-02-24T03:05:02.177 に答える
0

このステートメントには2つの問題があります。

str.replace("(\d)(\d{3}\.)","$1,$2");

1つ目は、正規表現オブジェクトではなく文字列を渡すことです。2つ目は、文字列リテラル内でバックスラッシュが特定のもの(たとえば、"\n"改行)をエスケープする特別な意味を持ち、実際のバックスラッシュを文字列リテラルは、2倍にする必要があります"\\"。コンストラクターを使用しRegExp()て文字列から正規表現オブジェクトを作成すると、次のようになります。

str.replace(new RegExp("(\\d)(\\d{3}\\.)"),"$1,$2");

したがって、そこからこれを行うことができます:

var quantifier = 3
str = str.replace(new RegExp("(\\d)(\\d{" + quantifier + "}\\.)"),"$1,$2");
于 2012-02-24T03:05:11.977 に答える
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

実例:

\したがって、文字列でエスケープする必要があることに注意してください\\

お役に立てれば。

于 2012-02-24T03:09:44.173 に答える