グループ化して量指定子を指定

広告

メタ文字の"*"、"+"、"?"及び範囲を指定する{n,m}を使用する場合、繰り返しの対象はメタ文字の直前の一文字だけでした。ここでは一文字ではなく複数の文字を1つのグループとして扱い、複数の文字を繰り返しの対象にする方法を確認します。

複数の文字を対象にするには、複数の文字を()で囲みグループにします。記述方法は次のようになります。

(複数の文字)メタ文字

※ 括弧は量指定子のためのグループ化以外にも使用されます

上記では「(」から「)」で囲まれた文字列全体が繰り返しの対象となります。メタ文字には"*"や"+"などが指定できます。例えば"bye"と言う3つの文字が1回以上繰り返されて現れた場合にマッチする正規表現は次の通りです。

"a(bye)+b"

上記の場合、「(」から「)」で囲まれた間に書かれた文字が1つのグループとなります。そしてメタ文字の"+"は直前にある文字が1回以上繰り返された場合にマッチしますが、今回は直前の文字がグループなのでグループの中の複数の文字が1回以上繰り返された場合にマッチします。

○ abyeb
○ abyebyeb
○ abyebyebyeb

グループ化を用いることで、文字の集まりである文字列を対象とした繰り返しをパターンとして定義することが出来ます。

サンプルプログラム

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

JSample7_1.java

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

class JSample7_1{
  public static void main(String args[]){
    String str1 = "bananaba";
    String str2 = "banaba";
    String str3 = "baneba";

    String regex1 = "a(na)+b";
    Pattern p1 = Pattern.compile(regex1);

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

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

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

p7-1

( Written by Tatsuo Ikura )