web-dev-qa-db-ja.com

Javascript + Regex =エラーを繰り返すものはありませんか?

私はRegexを初めて使用し、それを新しいプロジェクトの1つに組み込み、それを学習し、スキルのレパートリーに追加できるかどうかを確認しようとしています。ただし、ここで障害になっています。

.search関数を使用して、ユーザーの入力に不正な文字が含まれているかどうかを確認しようとしています。

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

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

Uncaught SyntaxError: Invalid regular expression: /[[]?*+|{}\()@.

]/: Nothing to repeat

私の人生では、コードの何が問題なのかわかりません。誰かが私を正しい方向に向けることができますか?

59
esqew

正規表現の特殊文字をエスケープするために使用されるバックスラッシュを2倍にする必要があります。ただし、@ Bohemianが指摘しているように、これらのバックスラッシュのほとんどは必要ありません。残念ながら、彼の答えはあなたと同じ問題に苦しんでいます。あなたが実際に欲しいのは:

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

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

4重のバックスラッシュに注意してください。それは間違いなく必要です。正規表現コンパイラに渡される文字列は、@ Bohemianの文字列と同じであり、正しく機能します。

80
andrewdski

@Bohemianから構築する場合、最も簡単なアプローチは正規表現リテラルを使用することだと思います。例えば:

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

エスケープ文字をエスケープする必要がないため、正規表現リテラルは素晴らしいです。また、一部のIDEでは無効な正規表現が強調表示されます(私は常にそれらをめちゃくちゃにするので非常に役立ちます)。

7
NobodyMan

まず、文字クラス[...]most文字はエスケープする必要がありません-それらは単なるリテラルです。

したがって、正規表現は次のようになります。

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

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

2
Bohemian