regex 如何向现有正则表达式添加标志?

f0brbegy  于 2023-06-07  发布在  其他
关注(0)|答案(4)|浏览(105)

我有一堆正则表达式,例如。/[a-z]/。稍后在我的程序中,我需要将其作为/[a-z]/g,因此我需要稍后添加'global'修饰符。如何向现有正则表达式添加修饰符?

vybvopom

vybvopom1#

使用RegEx sourceflags将正则表达式与标志分开。然后用字符串创建一个新的,并设置所需的标志。

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

dl5txlt92#

你可以写一个方法-

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

oyxsuwqo3#

下面是一个基于epascarello的答案和评论的函数。你说你有很多regexp需要修改,你可以重新定义引用它们的变量,或者通过函数调用来创建一些新的变量。

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)。

ebdffaop

ebdffaop4#

有一个方面在前面的回答中没有提到,所以加上我的两分钱...
优秀的答案(+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和spread运算符的旧浏览器,则需要将字符串的并集手写,因为RegExp构造函数不允许复制标志。

相关问题