Javascript 向现有正则表达式添加修饰符
我有很多正则表达式,比如 下=/[a-z]/ 稍后在我的程序中,我需要将其用作/[a-z]/g 例如,我需要稍后添加“全局”修饰符。 那么,如何向现有正则表达式添加修饰符呢?使用正则表达式并将正则表达式与标志分开。然后用字符串创建一个新的,并设置所需的标志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
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中实现。