文字クラスの否定(^)

広告

文字クラスはマッチさせたい候補の文字を列挙して使いますが、列挙した文字以外の全ての文字にマッチさせることも可能です。このような場合にはメタ文字の"^"を使います。

書式は次の通りです。

"[^abc]"

上記の場合であれば"a"、"b"、"c"以外の全ての文字が含まれる文字列にマッチします。

否定を使う場合には必ず文字クラスの先頭に"^"を記述します。文字クラスの先頭以外に"^"が記述されていた場合は文字の"^"として扱われます。例えば次のような記述を考えてみます。

"[ab^0-9]"

例えば上記では"a"、"b"、0から9以外、と言う意味ではなく、"a"、"b"、"^"、"0から9"の文字クラスです。

逆に言えば文字クラスの中で候補の一つとして"^"を使いたい場合は、先頭以外の場所に記載して下さい。先頭以外で使われた場合は特別な意味を持たないためエスケープ処理も不要です。

具体的には次のように記述します。

String str = "Document No.7";
String regex = "No.[^0-9]";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);

if (m.find()){
  System.out.println("マッチしました");
}else{
  System.out.println("マッチしません");
}

上記の場合はマッチしません。

サンプルプログラム

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

JSample3_1.java

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

class JSample3_1{
  public static void main(String args[]){
    String str1 = "0x08";
    String str2 = "0xT2";
    String str3 = "0x3e";
    String str4 = "0x5@";

    String regex = "0x[^e-zE-Z]";
    Pattern p = Pattern.compile(regex);

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

    check(p, str1);
    check(p, str2);
    check(p, str3);
    check(p, str4);
  }

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

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

p3-1

文字クラスの否定の場合は、思いがけない文字に一致する場合がありますので注意して下さい。例えば"^0-9"では数字以外ということなのでアルファベットにマッチするように思ってしまう場合もありますが、アルファベット以外の様々な記号にも一致します。

( Written by Tatsuo Ikura )