5

Java正規表現に関するこのOracleチュートリアルから、次のビットを取得しました。

交差点

ネストされたすべてのクラスに共通する文字のみに一致する単一の文字クラスを作成するには、[0-9&&[345]] のように && を使用します。この特定の交差により、両方の文字クラスに共通の数字 (3、4、および 5) のみに一致する単一の文字クラスが作成されます。

正規表現を入力してください: [0-9&&[345]] 検索する入力文字列を入力してください: 3 インデックス 0 で始まりインデックス 1 で終わるテキスト "3" が見つかりました。

なぜ役に立つのでしょうか?つまり、 345だけをパターン化したい場合、なぜ「交差点」の代わりに[ 345 ] だけをパターン化しないのでしょうか?

前もって感謝します。

4

1 に答える 1

4

簡単な問題を考えてみましょう: 文字列内の英語の子音を一致させます。すべての子音 (または範囲のリスト) を一覧表示するのが 1 つの方法です。

[B-DF-HJ-NP-TV-Zb-df-hj-np-tv-z]

別の方法は、ルックアラウンドを使用することです。

(?=[A-Za-z])[^AEIOUaeiou]
(?![AEIOUaeiou])[A-Za-z]

文字クラスの交差を使用せずにこれを行う方法が他にあるかどうかはわかりません。

文字クラス交差ソリューション (Java):

[A-Za-z&&[^AEIOUaeiou]]

.NET の場合、共通部分はありませんが、文字クラスの減算があります。

[A-Za-z-[AEIOUaeiou]]

実装の詳細はわかりませんが、文字クラスの交差/減算が、文字クラス操作が利用できない場合の最もクリーンな代替手段であるルックアラウンドを使用するよりも高速であっても驚かないでしょう。

もう 1 つの考えられる使用法は、事前に作成された文字クラスがあり、そこからいくつかの文字を削除したい場合です。クラスの交差が適用される可能性がある場合に遭遇した 1 つのケースは、改行を除くすべての空白文字に一致することです。

@beerbajay がコメントしているように、別の可能なユースケース:

[\p{InGreek}&&\p{Ll}]小文字のギリシャ文字など、組み込みの文字クラスが主な使用例だと思います。

于 2013-04-10T19:53:37.337 に答える