- Home ›
 - Java正規表現の使い方 ›
 - オプション修飾子 ›
 - HERE
 
Unicodeに準拠した大文字と小文字を区別しない
compileメソッドの引数としてPattern.UNICODE_CASEを指定するか、埋め込みフラグで(?u)を使用すると非ASCIIのUnicode文字の大文字と小文字を区別しなくなります。
UNICODE_CASE public static final int UNICODE_CASE
Unicode に準拠した大文字と小文字を区別しないマッチングを有効にします。 このフラグと CASE_INSENSITIVE フラグを同時に指定した場合は、Unicode 標準に準拠した大文字 と小文字を区別しないマッチングが行われます。デフォルトの大文字と小文字を区別しないマッチ ングでは、US-ASCII 文字セットの文字だけがマッチします。 Unicode に準拠した大文字と小文字を区別しないマッチングは、埋め込みフラグ表現 (?u) を使用 して有効にすることもできます。 このフラグを指定すると、パフォーマンスが低下する場合があります。
次のように記述します。
String regex = "pattern"; Pattern p = Pattern.compile(regex, Pattern.UNICODE_CASE);
埋め込みフラグ表現 (?u)を使って次のようにパターン内に記述することもできます。
String regex = "(?u)pattern";
このオプション修飾子を使用する場合はあわせてCASE_INSENSITIVEを同時に指定することで、非ASCII文字の大文字と小文字を区別しなくなります。例えば全角の"A"と"a"を区別せずにマッチします。
具体的な例で考えてみます。次のようなパターンを定義しました。
"Ant"
ターゲット文字列毎に上記のパターンにマッチするかどうかの一覧が下記となります。
○ Ant × ant × ANT
では先ほどのパターンに"(?i)"と"(?u)"を付けます。
"(?i)(?u)Ant"
"(?i)"が付けられると大文字と小文字を区別せずにマッチするかどうかを判断します。そして"(?u)"が付けられると非ASCII文字にも適用されるようになります。ターゲット文字列毎に上記のパターンにマッチするかどうかの一覧が下記となります。
○ Ant ○ ant ○ ANT
サンプルプログラム
では実際に試してみます。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class JSample7_1{
  public static void main(String args[]){
    String str1 = "ANT";
    String str2 = "ant";
    String regex1 = "ant";
    Pattern p1 = Pattern.compile(regex1);
    String regex2 = "(?u)ant";
    Pattern p2 = Pattern.compile(regex2);
    String regex3 = "(?i)ant";
    Pattern p3 = Pattern.compile(regex3);
    String regex4 = "(?i)(?u)ant";
    Pattern p4 = Pattern.compile(regex4);
    String regex5 = "ant";
    Pattern p5 = Pattern.compile(regex5, Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE);
    System.out.println("パターン : " + regex1);
    check(p1, str1);
    check(p1, str2);
    System.out.println("パターン : " + regex2);
    check(p2, str1);
    check(p2, str2);
    System.out.println("パターン : " + regex3);
    check(p3, str1);
    check(p3, str2);
    System.out.println("パターン : " + regex4);
    check(p4, str1);
    check(p4, str2);
    System.out.println("¥nPattern.compile(regex, Pattern.UNICODE_CASE | Pattern.CASE_INSENSITIVE)");
    System.out.println("パターン : " + regex5);
    check(p5, str1);
    check(p5, str2);
  }
  private static void check(Pattern p, String target){
    Matcher m = p.matcher(target);
    if (m.find()){
      System.out.println("○ " + target);
    }else{
      System.out.println("× " + target);
    }
  }
}
			ではコンパイルを行った上で実行してみます。
			
			
( Written by Tatsuo Ikura )
				
JavaDrive