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