18 Stimmen

Hinzufügen von Modifikatoren zu einem vorhandenen regulären Ausdruck

Ich habe eine Reihe von regulären Ausdrücken wie lower = /[a-z]/ Später in meinem Programm muss ich dies als /[a-z]/g verwenden d. h. ich muss den 'globalen' Modifier später hinzufügen. Wie füge ich also einen Modifier zu einem vorhandenen regulären Ausdruck hinzu?

25voto

epascarello Punkte 194350

Verwenden Sie RegEx source und flags, um den regulären Ausdruck von den Flags zu trennen. Erstellen Sie dann einen neuen mit dem String und setzen Sie die benötigten Flags.

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") )

4voto

Chase Punkte 360

Hier ist eine Funktion, um auf die Antwort von epascarello und die Kommentare aufzubauen. Du hast gesagt, dass du später einige regexps ändern möchtest, du könntest einfach die Variable neu definieren, auf die sie sich beziehen, oder einige neue mit einem Funktionsaufruf erstellen.

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]/;
//Einige Code-Zeilen dazwischen
lower = modifyRegexpFlags(lower, "g");

Wenn das zweite Argument ausgelassen wird, werden die alten Modifier verwendet.
(Credit an davin für die Idee).

4voto

kennebec Punkte 98551

Sie können dafür eine Methode schreiben-

RegExp.prototype.reflag= function(flags){
    return RegExp(this.source, flags);
}

0voto

wordragon Punkte 1232

Ein Aspekt, der in früheren Antworten nicht wirklich behandelt wurde, also füge ich meinen Senf hinzu...

Die ausgezeichneten Antworten (+1 für epascarello!) hier decken nicht ganz alle Aspekte ab. Wenn Sie die Funktion verallgemeinern möchten, um beliebige Flags zu erlauben, die zu beliebigen Regex hinzugefügt werden:

function addregexflags(regx, newflags) {
    // neue Flags hinzufügen, ohne Duplikate (funktioniert nicht in alten Browsern oder IE)
    newflags = [...new Set([...regx.flags.split(''), ...newflags.split('')])].join('');
    return new RegExp(regx.source, newflags);
}

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

Wenn Sie ältere Browser unterstützen müssen, die Sets und den Spread-Operator nicht unterstützen, müssen Sie die Vereinigung von Zeichenfolgen im Langformat durchführen, da der RegExp-Konstruktor keine Replikation von Flags zulässt.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X