2011-06-09 20 views
30

私はRegexを初めて使っています。新しいプロジェクトの1つに取り組んでいます。私はそれを学び、それを私のスキルの反復に加えることができるかどうかを確かめます。しかし、私はここにロードブロッキングを打っています。Javascript + Regex = Nothing to repeatエラー?

私は、ユーザーの入力がよう.search機能を使って、その中に不正な文字を持っているかどうかを確認しようとしている:

if (name.search("[\[\]\?\*\+\|\{\}\\\(\)\@\.\n\r]") != -1) { 
    ... 
} 

しかし、私はこの行は、それが含まれている関数を実行しようとすると、それはその特定の行について次のエラーがスローされます。

私の人生にとっては、私のコードで何が間違っているか見ることはできません。誰かが私を正しい方向に向けることができますか?

答えて

50

正規表現の特殊文字をエスケープするために使用するバックスラッシュを2倍にする必要があります。しかし、@Bohemianが指摘するように、それらのバックスラッシュの大部分は必要ありません。残念ながら、彼の答えはあなたと同じ問題を抱えています。

バックスラッシュは、正規表現パーサーに渡されるのではなく、文字列を読み取るコードによって解釈されています。あなたは欲しい:

"[\\[\\]?*+|{}\\\\()@.\n\r]" 

4つのバックスラッシュに注意してください。それは間違いなく必要です。正規表現コンパイラに渡される文字列は、@ Bohemianの文字列と同じであり、正しく動作します。あなたはエスケープ文字をエスケープする必要はありませんので、

if (name.search(/[\[\]?*+|{}\\()@.\n\r]/) != -1) { 
    // ... stuff ... 
} 

正規表現リテラルはいいです、そして:

+3

btw、いくつかのlangsでは4倍は必要です;例えばjava yes、perl not – Bohemian

2

まず、文字クラス[...]のほとんどはの文字は単なるリテラルです。

だから、あなたの正規表現は次のようになります。

"[\[\]?*+|{}\\()@.\n\r]" 

これは私のためにコンパイルされます。

+0

はい、コンパイルできますが、正しく動作しません。 – Icet

+0

@Icet他の回答はあなたのために機能しませんか?そうでない場合、どの入力が「機能していません」か? – Bohemian

+0

たとえば、入力として+44が機能していません。このソリューションは、str.replace(/ [\ - \ [\] \/\ {\} \(\)\ * \ + \?\。\\\^\ $ \]]/g、 "\\ $ &"); – Icet

4

@Bohemianのオフビル、私は例えば、最も簡単な方法は、単にリテラルの正規表現を使用することだと思いますいくつかのIDEは無効な正規表現を強調表示します(私は常にそれらを台無しにすると非常に便利です)。