ユーザーから正規表現を取得し、それを数千の入力文字列に対して実行したい状況があります。マニュアルでは、RegExp
オブジェクトに.compile()
メソッドがあり、このような場合に処理を高速化するために使用されていることがわかりました。しかし、コンストラクタで既にそれらを渡した場合、なぜ正規表現文字列を再度渡す必要があるのですか?おそらく、コンストラクタは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が正規表現を「コンパイル」するとき、_re.source
_文字列をスラッシュで囲みます(例:re.source == "^(.)"
は"/^(.)/"
)。正規表現を手動でコンパイルした場合、Operaはこの事実を認識せず、先に進んで再度コンパイルします(_re.source
_は"//^(.)//"
になります)。各コンパイル結果はスラッシュの追加セット。正規表現の意味を変更し、エラーが発生します。
/
を使用している場合は、最初に正規表現をコンパイルして使用する必要があります。これを試してください。
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") )
RegExp.compileが行うすべてのことは、RegExpオブジェクトの基になる正規表現を置き換えることです。コンパイルは過去に価値があったかもしれないと思いますが、すべての最新のJSエンジンは最初の呼び出しで正規表現を「コンパイル」し、その「コンパイル済み」バージョンをキャッシュします。