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?
Antworten
Zu viele Anzeigen?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") )
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).
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.