我有一种情况,我希望从用户那里得到一个正则表达式并针对几千个输入字符串运行它。在手册中,我发现RegExp
对象有一个.compile()
方法,用于加速这种情况。但是,如果我已经在构造函数中传递了它们,为什么我必须再次将regexp字符串传递给它?也许构造函数执行compile()
本身?
答案 0 :(得分:85)
RegExp().compile()
method is deprecated。它与构造函数基本相同,我假设它是不推荐使用的原因。你现在应该只需要使用构造函数。
换句话说,您曾经能够这样做:
var regexp = new RegExp("pattern");
regexp.compile("new pattern");
但是现在与简单地说:
并没有什么不同var regexp = new RegExp("pattern");
regexp = new RegExp("new pattern");
答案 1 :(得分:6)
使用Opera 11,运行RegExp.compile()
实际上会导致错误。
显然,当Opera“编译”正则表达式时,它会将re.source
字符串包含在正斜杠中(例如re.source == "^(.)"
变为"/^(.)/"
)。如果您手动编译正则表达式,Opera不会识别此事实并继续进行再次编译(re.source
变为"//^(.)//"
)。每次编译都会产生一组额外的正斜杠,这会改变正则表达式的含义并导致错误。
答案 2 :(得分:4)
如果您使用/
,则必须先编译正则表达式才能使用它,试试这个:
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") )

答案 3 :(得分:3)
据我所知,所有RegExp.compile都会替换RegExp对象的底层正则表达式。我认为编译过去可能有价值,但所有现代JS引擎在第一次调用时“编译”正则表达式并缓存“已编译”版本。