直前の文字を0回以上繰り返し(*, *?, *+)

広告

メタ文字の1つである"*"をパターンの中に記述すると"*"の直前にある文字が0回以上繰り返された文字列にマッチします。0回でも可なので直前の文字が存在しなくてもマッチします。

書式は次の通りです。

"X*"     最長一致数量子
"X*?"    最短一致数量子
"X*+"    強欲な数量子

※ 3つの種類の違いについては「最長一致数量子/最短一致数量子/強欲な数量子」を参照して下さい。以降は最長一致数量子について解説します。

"X*"は直前の文字である"X"が0回以上繰り返したものにマッチします。0回以上というのは"X"が無い場合と"X"や"XXXXX"など"X"が1回以上繰り返されている文字マッチするということになります。(直前の文字が無い場合は、空文字にマッチしていることになります)。

例としてパターン"aX*b"がどのようなターゲット文字列の場合にマッチするかしないかは次のようになります。

パターン "aX*b"

○ ab
○ aXb
○ aXXXb
○ aXXXXXXb
× aYb

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

String str = "boolean";
String regex = "bo*l";
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(str);

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

上記の場合、"b"+"o"が0回以上+"l"となりますのでマッチします。

サンプルプログラム

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

JSample3_1.java

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

class JSample3_1{
  public static void main(String args[]){
    String str1 = "bl";
    String str2 = "bol";
    String str3 = "boool";
    String str4 = "baool";
    String str5 = "boolean";

    String regex = "bo*l";
    Pattern p = Pattern.compile(regex);

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

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

  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

( Written by Tatsuo Ikura )