Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 向现有正则表达式添加修饰符_Javascript_Regex_Modifier - Fatal编程技术网

Javascript 向现有正则表达式添加修饰符

Javascript 向现有正则表达式添加修饰符,javascript,regex,modifier,Javascript,Regex,Modifier,我有很多正则表达式,比如 下=/[a-z]/ 稍后在我的程序中,我需要将其用作/[a-z]/g 例如,我需要稍后添加“全局”修饰符。 那么,如何向现有正则表达式添加修饰符呢?使用正则表达式并将正则表达式与标志分开。然后用字符串创建一个新的,并设置所需的标志 var re = /^[a-z]*$/; var re2 = new RegExp(re.source, re.flags + "i"); console.log( re.test("abc") ) console.log( re.test

我有很多正则表达式,比如 下=/[a-z]/ 稍后在我的程序中,我需要将其用作/[a-z]/g 例如,我需要稍后添加“全局”修饰符。 那么,如何向现有正则表达式添加修饰符呢?

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

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

这是一个基于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");
如果省略第二个参数,将使用旧的修饰符

(这个想法要归功于戴文)。

你可以为它写一个方法-

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

一个方面在前面的回答中没有涉及,所以加上我的两分钱

这里的优秀答案(+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

如果您必须支持不支持集合和扩展运算符的旧浏览器,则需要直接合并字符串,因为RegExp构造函数不允许复制标志。

我相信您可以访问修改器,如属性,例如
lower.global
lower.multiline
lower.ignoreCase
@Chase它们是只读的@Chase,请回答@davin我会听从更有经验的人,我只是尝试了一下,如果我没有在构造函数中显式调用旧函数的toString(),它就会抛出一个错误。可能还有更多的警告,我相信其他人以前也经历过。@Chase,不确定您是如何调用
toString()
,但您也可以使用
regex.source
它必须通过字符串甚至新的regexp解析来完成,这真的很尴尬……请注意,从mdn页面判断,
flags
属性没有在internet explorer中实现。