2016-08-01 6 views
2

Javaは一貫性のない正規表現パターンをどのように処理するのですか?私はこれを試しています:Javaの一貫性のない正規表現文字クラス

Pattern p = Pattern.compile("[a-d[m-p][^d][m]]"); 
Matcher m = p.matcher("d"); 
System.out.println(m.matches()); 

私はそれが本当に受けています。しかし、私の文字クラスには[^ d]が含まれているので、正規表現によれば一致するはずはありません。しかしdもパターン(a-d)に含まれているので、一致する結果は肯定的です。では、パターンの解析はどのように行われますか?それが例外を投げた場合、それは良いだろうか?

+0

なぜ矛盾しますか?それはJavaのためにかなりokです。 –

+0

パターンに文字 "d"を含めて除外したので、私は矛盾していると言った。 – randombee

+1

'-verbose'オプションを指定した"スマート "コンパイラが余分に[m]オプションを指定するかもしれませんが、[^ d]は効果がありません。" && [^ d] "を意味しましたか?** FindBugs **のようないくつかのツールがこのような欠陥をマークしています。 –

答えて

5

挙動が正しく、documented

文字クラスは、他の文字クラス内に表示されることがあり、そして組合演算子(implicit)と交差演算子(&&)によって構成されてもよいです。また

Java Character Classes reference次を参照してください。d

[a-d[m-p]]apまたはmを:[a-dm-p](組合)

ので、パターンが一致します。

  • [ - 文字クラスの開始
  • a-dから
  • [^d]pを介して、またはm - - dOR
  • [m-p]aないdOR
  • [m]からm
  • ] - 文字クラスの末尾。

da-dと一致すると、一致が返されます。

あなたがそのうちのいくつかを除いてシンボルの範囲を一致させたい場合は、あなたが減算必要があります:a-d範囲は今と「焼き」であることから

[a-d[m-p][m]&&[^d]] 

をこの正規表現はdとは一致しません&&[^d]となり、dと一致しなくなります。

+0

真実は、組合が単純な「OR」であることを完全に忘れていました。ありがとう – randombee

+1

はい。ちょうどFYI:すぐに視覚的に正規表現をテストすることができますhttp://www.ocpsoft.org/tutorials/regular-expressions/java-visual-regex-tester/ –

関連する問題