2012-01-06 10 views
0

をエスケープする必要があり、私はこの正規表現があります。どのように私はこのJavaScriptの正規表現(RFC 2822のメールバリデータ)

/[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/ 

そして、私はそうのようなスラッシュをエスケープしています:

/[a-z0-9!#$%&'*+\/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+\/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/ 

これは正常に動作するようにしかし、私はエッジケースがないことと、これを行うことによって正規表現が壊れてしまうことに懸念しています。これはスラッシュをエスケープする適切な方法ですか?

かそこらのように、私が代わりにnewと宣言する必要があります。

var re = new RegExp(/[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?/); 

JavaScriptがスラッシュなしで正しく実行は、(Chromeで)エスケープが、それは私の編集者(TextMateのの)シンタックスハイライトで台無し。さらにテストすると、newさえも、構文強調表示の問題が解消されません。

答えて

2

リテラルJavaScriptの正規表現ではスラッシュをエスケープする正しい方法は、バックスラッシュである:「

// unescaped: 
some/string 
// escaped in regex literal: 
/some\/string/ 

私の知る何のエッジケースはありません、とあなたはドン場合は、エラーを取得する必要がありますそれをしないでください。

new RegExp()を使用すると、正規表現オブジェクトではなく文字列を渡すことになっています。つまり、new RegExp("/[a-z0- etc")という形式を使用する必要があります。これは構文の強調表示を修正するはずですが、文字列リテラルにもすべてのバックスラッシュを含む、エスケープする必要があります。正規表現でバックスラッシュが使われる頻度を考えると、これは文字列形式がかなり醜いので、正規表現を動的に構築する必要がある場合にのみ一般的に使用されます。

+0

完璧な回答、ありがとう! –