2009-07-09 4 views
11

JavaのRegex.Patternは、次の文字クラスをサポートしています。Java Regexの文字クラスの交差点の背後にある点は何ですか?

[a-z&&[def]] 

は "d、e、またはf"に一致し、交差点と呼ばれます。

機能上、これは次の点と変わりません。

[def] 

大きなREで読みやすく理解しやすい。ですから、私の質問は、文字クラスのCSGのような操作の完全なサポートを指定する以外に、交差点はどのような用途ですか?

(私は[a-z&&[^bc]][a-z&&[^m-p]]のような減算の効用を理解していますが、上記のような交差点について具体的に尋ねています)

答えて

4

を、私はそうする必要があったことがありませんけれども、私は適切ではありません事前に定義された文字クラスでの使用を想像できますお互いの部分集合(したがって、交点を元の2つの文字クラスとは異なるものにする)。例えば。小文字のラテン文字のみに一致:

[\p{Ll}&&\p{InBasicLatin}] 
+0

おそらく、上記のREの結果は\ p {Lower}との違いはありません。\ p {Lower}の定義は小文字だけです – Christopher

+0

デフォルトのアルファベットの問題を避けるため、\ p {LI}に\ p {LI}を変更しました。 – iammichael

1

私は特定のサンプルだけであると信じている「コンセプトの証明。」 2つの交差する文字クラスは、両方の文字セットにそれぞれ一致する文字にのみ一致します。あなたが言及した減算は、演算子の実際の実際のアプリケーションです。

簡単に言えば、隠された意味はありません。

1

あなたがプログラム的に2つのセットの間のマッチング正規表現を構築することができます。

String regex = String.format("[%s&&[%s]]", characterClass, whiteList); 
+0

これは理論的な観点からは意味がありますが、これを使用する具体的な例は何ですか? – Christopher

+0

私は今すぐ仮説的な例はありません:-( – dfa

1

交差点は、一方のクラスが他方のセットのサブセットでない場合に便利です。多くの定義済みの文字クラス(部分リストはjavadocに与えられています)、特にユニコードのさまざまなブロックがあります。中国語で使用されているすべての文字と、日本語で使用されているすべての文字に定義されたブロックがあるとします。オーバーラップはかなりありますが、どちらの側でも完全ではありません(ユニコードブロッククラスがこれを反映しているかどうかはわかりません)。両方の言語で発生している文字のみを照合したい場合は、その2つの言語の共通部分を使用することができます。