看一下RegExp
原型上的访问器属性,比如source
和flags
。这样你就可以这么做:
var myRe = new RegExp("weather", "gi")
var copyRe = new RegExp(myRe.source, myRe.flags);
有关规范,请参见http://www.ecma-international.org/ecma-262/6.0/#sec-get-regexp.prototype.flags。
正则表达式的序列化和反序列化
如果您的目的是将正则表达式序列化,例如转换为JSON格式,然后再进行反序列化,我建议将正则表达式存储为[source, flags]
元组,并使用new RexExp(source, flags)
重新构建它。这比尝试使用正则表达式或eval拆分它更加简洁。例如,您可以将其字符串化为
function stringifyWithRegexp(o) {
return JSON.stringify(o, function replacer(key, value) {
if (value instanceof RegExp) return [value.source, value.flags];
return value;
});
}
回来的路上,你可以使用带有修饰符的JSON.parse
来获取正则表达式。
修改正则表达式
如果您想在保留标志的同时修改正则表达式,可以创建一个新的正则表达式,其源已修改并且具有相同的标志:
var re = /weather/gim;
var newre = new RegExp(re.source + "| is", re.flags);
.replace()
方法会破坏任何原始表达式中包含正斜杠的正则表达式。此外,你的技巧假设应该始终使用gi
标志。 - nnnnnneval
可以做到。 - Bergi