Подтвердить что ты не робот

Добавление модификаторов в существующее регулярное выражение

У меня есть куча регулярных выражений вроде lower =/[a-z]/ Позже в моей программе мне нужно использовать это как /[a-z]/g то есть. Мне нужно добавить "глобальный" модификатор позже. Итак, как добавить модификатор в существующее регулярное выражение?

4b9b3361

Ответ 1

Используйте источник и флаги 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") )

Ответ 2

Вот функция, чтобы построить на epascarello ответ и комментарии. Вы сказали, что у вас есть несколько регулярных выражений для изменения позже, вы можете просто переопределить переменную, на которую они ссылаются, или сделать некоторые новые с вызовом функции.

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

Если второй аргумент опущен, будут использоваться старые модификаторы.
(Примите к сведению davin за идею).

Ответ 3

Вы можете написать для него метод -

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

Ответ 4

Один из аспектов, на самом деле не описанный в более ранних ответах, поэтому добавление двух центов...

Отличные ответы (+1 для epascarello!) Здесь не совсем охватывают все базы. Если вы хотите обобщить функцию, чтобы добавить любые флагов в любое регулярное выражение:

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 не разрешает репликацию флагов.