17

我有一堆正则表达式,比如 lower = /[az]/ 稍后在我的程序中我需要将其用作 /[az]/g 即。我需要稍后添加“全局”修饰符。那么如何给现有的正则表达式添加修饰符呢?

4

4 回答 4

23

使用 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") )
于 2012-02-24T20:17:56.887 回答
4

这是一个基于 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)。

于 2012-02-24T20:58:02.687 回答
4

你可以为它写一个方法——

RegExp.prototype.reflag= function(flags){
    return RegExp(this.source, flags);
}
于 2012-02-24T21:48:53.817 回答
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 和扩展运算符的旧浏览器,则需要将字符串的并集作为正则表达式构造函数不允许复制标志。

于 2018-08-19T18:45:28.780 回答