Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのPattern.UNICODE_CASEフィールドとは?具体例付きで解説


Pattern.UNICODE_CASEは、Javaの正規表現においてUnicode対応のケースフォールディング(大文字・小文字の同一視)を有効にするためのフラグです。

通常、CASE_INSENSITIVEフラグだけでは大文字・小文字の区別を無効化できますが、その対象は主にASCII文字に限られます。UNICODE_CASECASE_INSENSITIVEと組み合わせてcompile()メソッドに渡すことで、「Þ(U+00DE)」と「þ(U+00FE)」のようなASCII以外のUnicode文字についても、大文字・小文字を問わずマッチさせられるようになります。

主なポイント

  • 単体では機能せず、CASE_INSENSITIVEとの併用が前提となるフラグ
  • Unicodeの大文字・小文字の対応関係(ケースマッピング)に基づいてマッチングを行う
  • 多言語テキストを扱う正規表現処理で特に有用

使用例

以下のコードでは、パターン「Þ」(\u00de)をUNICODE_CASECASE_INSENSITIVEの両フラグ付きでコンパイルし、4つの異なる文字に対してマッチングを実行しています。

import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class UNICODE_CASE_Example {
    public static void main(String args[]) {
        String regex = "\u00de";
        // 正規表現をコンパイル(UNICODE_CASE + CASE_INSENSITIVE を指定)
        Pattern pattern = Pattern.compile(regex, Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
        // 検証対象の文字列配列
        String str[] = {"\u00de", "\u00fe", "\u00ee", "\u00ce"};
        for (String ele : str) {
            Matcher matcher = pattern.matcher(ele);
            if (matcher.matches()) {
                System.out.println(ele + " is a match for " + regex);
            } else {
                System.out.println(ele + " is not a match for " + regex);
            }
        }
    }
}

実行結果

Þ is a match for Þ
þ is a match for Þ
î is not a match for Þ
Î is not a match for Þ

結果の解説

実行結果を見ると、大文字の「Þ」と小文字の「þ」の両方がマッチしていることが確認できます。これがUNICODE_CASEフラグの効果です。

一方、「î」や「Î」は「Þ」とは大文字・小文字の対応関係にないため、マッチしません。つまり、このフラグは単純に大文字小文字を無視するのではなく、Unicode標準で定義されたケースマッピングの対応関係に基づいてマッチングを行っている点が特徴です。

  1. JavaのPattern.COMMENTSフィールドとは?使い方を実例付きで解説

    JavaのPatternクラスが持つCOMMENTSフィールドは、正規表現パターンの中に空白文字やコメントを自由に記述できるようにするフラグです。このフラグをcompile()メソッドの第2引数として指定すると、パターン内の空白文字や、#記号で始まるコメント部分はすべて無視されてコンパイルされます。 複雑な正規表現を扱う場合、そのままでは読みにくくなりがちですが、COMMENTSフラグを活用すれば、各部分に説明用のコメントを付けたり、改行やインデントを使って整形したりできるため、可読性と保守性が大きく向上します。なお、このフラグは正規表現内に(?x)を埋め込む方法でも同等の効果が得られます。

  2. 【Java入門】Pattern.CANON_EQフラグの使い方をサンプルコードで解説

    JavaのPatternクラスには、正規表現のマッチング動作を制御するためのさまざまなフラグが用意されています。そのひとつであるCANON_EQフィールドは、「正規化等価(canonical equivalence)」に基づいて文字を照合するためのフラグです。このフラグをcompile()メソッドに指定すると、2つの文字は完全な正準分解(canonical decomposition)の結果が等しい場合に限りマッチするとみなされます。ここでいう正準分解とは、Unicodeのテキスト正規化形式のひとつです。たとえば、アクセント記号付きの合成済み文字(1つのコードポイント)と、基本文字+結合文字(