我有一堆正则表达式 lower = / [a-z] / 稍后在我的程序中,我需要将其用作/ [a-z] / g 即。我需要稍后添加'全局'修饰符。 那么如何将修饰符添加到现有正则表达式中呢?
答案 0 :(得分:14)
使用RegEx source和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") )
答案 1 :(得分:4)
这是一个基于epascarello的答案和评论的功能。你说你有很多regexp可以在以后修改,你可以重新定义它们被引用的变量,或者通过函数调用创建一些新的。[/ p>
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的想法)。
答案 2 :(得分:4)
你可以为它编写一个方法 -
RegExp.prototype.reflag= function(flags){
return RegExp(this.source, flags);
}
答案 3 :(得分:0)
先前的答案并没有真正涵盖一个方面,所以加上我的两分钱...
这里的出色答案(对于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和span运算符的旧版浏览器,则需要长期使用字符串的并集,因为RegExp构造函数不允许复制标志。