2012-06-01 12 views
18

[^a]a以外の文字を意味しますが、[^](以下の文字はありません)はどういう意味ですか? [-]のように-が文字範囲の意味を失うのと同じように、はキャレットと一致すると仮定しました。私はこの問題をデバッグするのに時間がかかりすぎましたが、少なくともChrome 19では何にもマッチするように見えました。つまり、.に相当します。ここに該当する仕様があるのか​​、それとも期待される動作がありますか?Javascriptの正規表現で[^]の意味は何ですか?

はい、私はおそらく[\^]を使用する必要があることを認識しています。この質問は、病的な好奇心の中でより多くのものです。

+0

Hmm。それはセットを無効にしますが、セットが空であれば何も一致しません。それは正しいとは思わない。 []は何と一致しますか? [^]は[]が一致しないものと一致する必要があります。 – Okonomiyaki3000

+0

以下の答えに基づいて、それは "この表現を使用すべきではありません"という意味です! – jahroy

+2

関連パフォーマンステスト:http://jsperf.com/match-any-char-regex –

答えて

30

[^]一致する単一のコード単位、[\s\S]と同様、[\0-\uffff](.|\s)(それを使用しないで、他とは違って、それはバックトラックに依存している)、等.との違いは、ドットが4つの改行コードポイント(\r,\n,\u2028、および\u2029)と一致しないことです。

[^]または[]は、ブラウザ間で一貫して動作しないため、正規表現が他のプログラミング言語で動作しないため、お勧めしません。 IE < = 8以前のSafariでは、空の文字クラスに対して従来の(JavaScript以外の)正規表現の動作を使用しています。古いバージョンのOperaでは、正しいJavaScriptの動作が逆になるため、[]はすべてのコードユニットに一致し、[^]は一致しません。伝統的な正規表現の振る舞いは、文字クラス内の先行のエスケープされていない]がリテラル文字として扱われ、文字クラスを終了しないことです。

XRegExpライブラリを使用する場合は、[][^]が正しく動作し、一貫してブラウザを通過します。 XRegExpには、ドットを任意のコード単位(ブラウザでは[^]と同じJavaScript仕様に正確に従う)に一致させるs(別名dotallまたはsingleline)フラグも追加されています。

+0

素晴らしい投稿です!あなたは古いSafariとOperaのバージョンについてより具体的に言えますか? –

+2

ありがとうございます。どのバージョンで問題が修正されたのかよく分かりません。私はSafari 3が間違っていることを知っています。 (初期のv3 Safariには、あまりにも単純なJSレイヤーでPCREを実行していたので、ほとんど知られていなかったRegExpの驚きがあった。)Operaは、最初にhttp://xregexp.com/cross_browser/ 。 Acid3が空の文字クラスを明示的にテストしているので、Acid3がリリースされた直後に修正された可能性があります(ESが伝統的な動作に合わせて変わることを望んでいたので、残念です。 IEが実際にv9まで問題を修正していないようだ(私は自分の投稿を編集した)。 – slevithan

1

意味は以下の否定です。何ゆえ、ここでは以下のなかっ:

  • ereg(): REG_EBRACK
  • preg_match(): Compilation failed: missing terminating ]
  • を:何を除いて

    ものはしかし、他のほとんどの正規表現エンジンはいえ表現でエラーをスロー

    すべてを=

2

キャレット^には多くの意味があります。正規表現構文のほとんどの文字と同様です。さらに、すべての文字は文脈に大きく依存しています。さらに複雑にするために、いくつかの文字と構文は、基礎をなすエンジン(Perl、Java)に依存します。

は離れて[^]を破るのをしてみましょう:

[]は、文字クラスです。文字クラスに記載されていない文字にマッチする、文字クラスの

否定:

[^です。

は、文字クラスの任意の文字を定義しませんでした。 したがって、動作はは定義されていませんです。意味ははありません。は無効ですので、と一致します。。 JavaScriptの仕様(ES3およびES5)によれば

+0

なぜ彼はちょうど '.'を実行しないのですか? –

+1

@Derek' .'は改行文字と一致しないためです。 –

+0

「動作は未定義です。」これにより、定義されていない振る舞いであるとECGスペックで定義されているため、実装が異なりますが、これは真実ではないと信じる可能性があります。 – nhahtdh

関連する問題