Javascript:RegExp.compile()有什么意义?

我有一个情况,我想从用户得到一个正则expression式,并运行几千个inputstring。 在手册中,我发现RegExp对象有一个.compile()方法,用于在这种情况下加快速度。 但是,为什么我必须再次传递正则expression式string,如果我已经在构造函数中传递它们呢? 也许构造函数执行compile()本身?

RegExp().compile()方法已被弃用 。 它基本上与构造函数相同,我认为这是为什么它被弃用。 你现在只需要使用构造函数。

换句话说,你曾经能够做到这一点:

 var regexp = new RegExp("pattern"); regexp.compile("new pattern"); 

但是现在和简单地说:

 var regexp = new RegExp("pattern"); regexp = new RegExp("new pattern"); 

而在Opera 11中,运行RegExp.compile()实际上会导致错误。

很明显,当Opera“编译”一个正则expression式时,它将re.sourcestring包装成正斜杠(例如re.source == "^(.)"变成"/^(.)/" )。 如果你手动编译正则expression式,Opera不会识别这个事实并继续编译它( re.source变成"//^(.)//" )。 每个编译都会产生一组额外的正斜杠,这会改变正则expression式的含义并导致错误。

据我所知,RegExp.compile所做的一切就是replaceRegExp对象的底层正则expression式。 我认为编译可能在过去有价值,但所有现代JS引擎在第一次调用“编译”的正则expression式,并caching“编译”版本。

如果你正在使用/你必须首先编译你的正则expression式来使用它,试试看:

 var regex=new RegExp('/[a-zA-Z]/') console.log("not compiled with escape /", regex.test("ciao") ) regex.compile() console.log("compiled", regex.test("ciao") ) var regex=new RegExp('[a-zA-Z]') console.log("not compiled, but no escape /", regex.test("ciao") )