大文字と小文字を区別しない

広告

compileメソッドの引数としてPattern.CASE_INSENSITIVEを指定するか、埋め込みフラグで(?i)を使用するとパターンをマッチする時に大文字と小文字を区別しなくなります。

大文字と小文字を区別しないマッチングを有効にします。

デフォルトの大文字と小文字を区別しないマッチングでは、US-ASCII 文字セットの文字だけがマッ
チします。Unicode に準拠した大文字と小文字を区別しないマッチングを有効にするには、
UNICODE_CASE フラグをこのフラグと組み合わせて指定します。

大文字と小文字を区別しないマッチングは、埋め込みフラグ表現 (?i) を使用して有効にすること
もできます。

このフラグを指定すると、パフォーマンスがわずかに低下する場合があります。

次のように記述します。

String regex = "pattern";
Pattern p = Pattern.compile(regex, Pattern.CASE_INSENSITIVE);

埋め込みフラグ表現 (?i)を使って次のようにパターン内に記述することもできます。

String regex = "(?i)pattern";

具体的な例で考えてみます。次のようなパターンを定義しました。

"Test"

ターゲット文字列毎に上記のパターンにマッチするかどうかの一覧が下記となります。

○ Test
× test
× TEST
× tesT

では先ほどのパターンに"(?i)"を付けます。

"(?i)Test"

"(?i)"が付けられると大文字と小文字を区別せずにマッチするかどうかを判断します。ターゲット文字列毎に上記のパターンにマッチするかどうかの一覧が下記となります。

○ Test
○ test
○ TEST
○ tesT

サンプルプログラム

では実際に試してみます。

JSample2_1.java

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

class JSample2_1{
  public static void main(String args[]){
    String str1 = "Hello";
    String str2 = "hello";
    String str3 = "HELLO";

    String regex1 = "hello";
    Pattern p1 = Pattern.compile(regex1);

    String regex2 = "(?i)hello";
    Pattern p2 = Pattern.compile(regex2);

    String regex3 = "hello";
    Pattern p3 = Pattern.compile(regex3, Pattern.CASE_INSENSITIVE);

    System.out.println("パターン : " + regex1);

    check(p1, str1);
    check(p1, str2);
    check(p1, str3);

    System.out.println("パターン : " + regex2);

    check(p2, str1);
    check(p2, str2);
    check(p2, str3);

    System.out.println("¥nPattern.compile(regex, Pattern.CASE_INSENSITIVE)");
    System.out.println("パターン : " + regex3);

    check(p3, str1);
    check(p3, str2);
    check(p3, str3);
  }

  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);
    }
  }
}

ではコンパイルを行った上で実行してみます。

p2-1

( Written by Tatsuo Ikura )