文字の範囲(-)

広告

文字クラスを使用する場合、マッチさせたい文字を全て列挙します。列挙する文字ばバラバラの場合は一つ一つ記述するしかありませんが、例えば数字の0から9や文字のaからzなどのように連続した文字を指定したい場合があります。このような場合にはメタ文字のハイフン(-)を使い範囲指定の形式で記述できます。

書式は次の通りです。

"[0-9]"

文字クラスの中では"-"は特別な意味を持ち範囲を表すために使われます。上記は"a"から"e"までの文字を順に記載したものと同じ扱いになります。よって上記は次のように記述した場合と同じです。

"[0123456789]"

同じようにアルファベットについても同じように範囲で指定することができます。例えば次の2つのパターンは同じ扱いとなります。

"[a-z]"
"[abcdefghijklmnopqrstuvwxyz]"

アルファベットの大文字についても同様です。

"[A-Z]"
"[ABCDEFGHIJKLMNOPQRSTUVWXY]"

もちろん先頭から最後までである必要はありません。4から7までとかDからMまでのように範囲指定することも可能です。

"[4-7]"
"[D-M]"

また同じ文字クラスの中に範囲と文字を組み合わせて記述することも可能です。

"[AD-MXY]"

"[AD-MXY]"は"[ADEFGHIJKLMXY]"と記載した場合と同じです。

範囲を複数文字クラス内に記述することもできます。

"[0-9a-zA-Z]"

"[0-9a-zA-Z]"は0から9、aからz、AからZのいずれかにの文字が含まれる文字列にマッチします。

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

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("マッチしません");
}

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

なおこのように文字クラスの中で"-"は特別な意味を持ちますので、文字クラスの中で候補の文字として"-"を使用する場合はエスケープ処理をして下さい。

サンプルプログラム

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

JSample2_1.java

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

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

    String regex1 = "0x[0-9A-F][0-9A-F]";
    Pattern p1 = Pattern.compile(regex1);

    String regex2 = "0x[0-9a-fA-F][0-9a-fA-F]";
    Pattern p2 = Pattern.compile(regex2);

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

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

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

    check(p2, str1);
    check(p2, str2);
    check(p2, str3);
    check(p2, 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);
    }
  }
}

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

p2-1

( Written by Tatsuo Ikura )