選択と量指定子の組み合わせ

広告

量指定子である"+"や"*"は選択に対しても適用することができます。その場合、選択の候補のいずれかが繰り返し現れるパターンを定義することが可能です。(量指定子に関しては「任意の文字と繰り返し(量指定子)」を参照して下さい)。

書式は次の通りです。

"(候補1|候補2|..)+"
"(候補1|候補2|..)*"

具体的な例で考えてみます。

"(Yes|No)+"

メタ文字の"+"は直前の文字を1回以上繰り返す文字列にマッチします。今回は繰り返しの対象となるものが選択となっていますので、"Yes"か"No"が1回以上繰り返す文字列にマッチするパターンとなっています。

では"s(Yes|No)+e"というパターンがターゲット文字列毎にマッチするかどうかを次に例として記述します。

○ sYese
○ sNoe
○ sYesNoYese
× sYesnoe

このように選択に対して繰り返しのメタ文字を指定することで、選択の中の同じ候補が繰り返されるだけではなく、複数の候補のいずれかが繰り返し現れる場合にマッチするパターンを定義することが出来ます。

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

String str = "No0010101001.";
String regex = "No(0|1)+.";
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 = "No01 is Apple";
    String str2 = "No12506 is Melon";
    String str3 = "No.01 is Banana";
    String str4 = "No12.5 is Lemon";

    String regex = "No(0|1|2|3|4|5|6|7|8|9)+ is";
    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);
    }
  }
}

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

p2-1

( Written by Tatsuo Ikura )