2009-05-19 11 views
47

私は、ユーザーから正規表現を取得し、それを数千の入力文字列に対して実行したいという状況があります。マニュアルでは、RegExpオブジェクトには.compile()メソッドがあり、このような場合にスピードアップする方法が見つかりました。しかし、なぜ私はコンストラクタでそれらを渡した場合、regexp文字列をもう一度渡す必要がありますか?おそらくコンストラクタはcompile()自身ですか?Javascript:RegExp.compile()のポイントは何ですか?

答えて

83

RegExp().compile() method is deprecated。これは基本的にコンストラクタと同じですが、私はそれが非難された理由を仮定しています。あなたは今日コンストラクタを使用する必要があります。言い換えれば

は、あなたがこれを行うことができるように使用:

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

をしかし、今日、それは単に呼び出すと何が違うのではありません。私の知る限り、すべての正規表現を伝えることができるよう

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

を.compileは、RegExpオブジェクトの基本となる正規表現を置き換えます。私は過去にコンパイルに価値があったかもしれないと思っていますが、現代のJSエンジンはすべて最初の呼び出しで正規表現をコンパイルし、コンパイルしたバージョンをキャッシュします。

+1

エンジンは正確に行うキャッシュ正規表現を?そして、彼らはいつもそれをしますか?式はどれくらいキャッシュに保持されますか?私は特にV8に興味があります。 – CoDEmanX

6

Opera 11では、RegExp.compile()を実行すると実際にエラーが発生します。

Operaが正規表現をコンパイルすると、re.source文字列がスラッシュ(たとえば、re.source == "^(.)""/^(.)/")にラップされます。正規表現を手動でコンパイルすると、Operaはこの事実を認識せずに先に進んでコンパイルし直します(re.source"//^(.)//"になります)。コンパイルするたびにスラッシュが追加され、正規表現の意味が変わり、エラーが発生します。

2
あなたが最初にあなたの正規表現をコンパイルするためにあなたが /を使用している場合は、それを使用する必要が

、これを試してみる:

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

+2

うわー、それは面白いです。私はちょうどそれをチェックし、あなたは正しい! MDNには言及されていません。 –

+2

この説明を参照してください:http://stackoverflow.com/a/7964948/651789 – ken

関連する問題