17

lower = /[az]/ のような正規表現がたくさんあります。プログラムの後半で、これを /[az]/g として使用する必要があります。後で「グローバル」修飾子を追加する必要があります。では、既存の正規表現に修飾子を追加するにはどうすればよいでしょうか?

4

4 に答える 4

23

RegExソースフラグを使用して、正規表現をフラグから分離します。次に、文字列を使用して新しいものを作成し、必要なフラグを設定します。

var re = /^[a-z]*$/;
var re2 = new RegExp(re.source, re.flags + "i");

console.log( re.test("abc") )
console.log( re.test("ABC") )
console.log( re2.test("abc") )
console.log( re2.test("ABC") )
于 2012-02-24T20:17:56.887 に答える
4

あなたはそれのためのメソッドを書くことができます-

RegExp.prototype.reflag= function(flags){
    return RegExp(this.source, flags);
}
于 2012-02-24T21:48:53.817 に答える
4

エパスカレロの回答とコメントに基づいて構築する関数を次に示します。後で変更する正規表現がかなりあるとおっしゃいましたが、それらが参照されている変数を再定義するか、関数呼び出しで新しいものを作成するだけです。

function modifyRegexpFlags(old, mod) {
    var newSrc = old.source;
    mod = mod || "";
    if (!mod) {
        mod += (old.global) ? "g" : "";
        mod += (old.ignoreCase) ? "i" : "";
        mod += (old.multiline) ? "m" : "";
    }
    return new RegExp(newSrc, mod);
}

var lower = /[a-z]/;
//Some code in-between
lower = modifyRegexpFlags(lower, "g");

2 番目の引数を省略すると、古い修飾子が使用されます。
(このアイデアは davin の功績によるものです)。

于 2012-02-24T20:58:02.687 に答える
0

以前の回答では実際にはカバーされていない側面があるため、2セントを追加します...

ここでの優れた回答(epascarelloの+1!)は、すべてのベースを完全にカバーしているわけではありません。関数を一般化して、任意の正規表現に追加された任意のフラグを許可する場合:

function addregexflags(regx, newflags) {
    // add new flags without duplication (won't work in old browsers or IE)
    newflags = [...new Set([...regx.flags.split(''), ...newflags.split('')])].join('');
    return new RegExp(regx.source, newflags);
}

addregexflags(/try/gi, "gm");    // /try/gim

Sets とスプレッド演算子をサポートしていない古いブラウザーをサポートする必要がある場合は、RegExp コンストラクターがフラグの複製を許可しないため、文字列の和集合を手書き入力する必要があります。

于 2018-08-19T18:45:28.780 に答える