2011-11-01 10 views
17

最近、仲間の開発者がRegExpリテラルをコンストラクタ呼び出しに変更した後、バグがありました。 正確なコードは、tagは、例えばrt:[email protected]ために、最初の(バギー)コールはnullを返し、第1の返している間Javascriptのregexpリテラルとコンストラクタの相違点

var parts = /rt:([^@]+)@(\d+)/.exec(tag); 

の元対

var parts = new RegExp("/rt:([^@]+)@(\d+)/").exec(tag); 

["rt:[email protected]", "60C1C036-42FA-4073-B10B-1969BD2358FB", "00000000077"]

言うまでもなく、私は変更を元に戻しましたが、最初にこのような違いがあるのはなぜですか。

答えて

33

する必要があります。それらはデリミタであり、正規表現のリテラルをマークします。 RegExpを使用する場合は削除する必要があります。そうでない場合は、文字通りスラッシュと一致します。

第2に、バックスラッシュは文字列リテラルのエスケープ文字です。式のためにリテラル\を作成するには、その文字列でエスケープする必要があります。

したがって、同等のは次のようになります。あなたがRegExpを使用したい場合は

new RegExp("rt:([^@]+)@(\\d+)") 

特にエスケープを書くのは表現が少し難しくなります。式を動的に作成する場合、つまり変数に格納されたテキストを挿入する場合などにのみ必要です。式が固定されている場合は、/.../という文字は、書きやすく、簡潔です。

+0

いい回答ですが、私は私のものを削除すると思います!特定のRegExpを再利用する必要がある場合はどうでしょうか?それはコンストラクタを使う良い時期ではありませんか?あるいは単に 'var resuasableRegex =/.. pattern ../;'と言うでしょうか? –

+0

@ElRonnoco:正確には、正規表現リテラルを変数に代入することもできます。 –

+0

情報ありがとうございます。次回は、エスケープ文字が必要ないことを確認するために、文字列をよりよく調べます。とにかく、リテラルははるかに簡単です。 –

4

\dは、コンストラクタnew RegExpに渡されたときにエスケープする必要があります。

/式のない一部です:だから、それは二つの問題があります

var parts = new RegExp("rt:([^@]+)@(\\d+)").exec(tag); 
関連する問題