直前の文字を0回か1回(?, ??, ?+)

広告

メタ文字の1つである"?"をパターンの中に記述すると"?"の直前にある文字が0回か1回現れる文字列にマッチします。

書式は次の通りです。

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

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

"X?"は直前の文字である"X"が0回か1回以上現れるものにマッチします。0回というのは"X"が無い場合、1回というのは"X"です。(直前の文字が無い場合は、空文字にマッチしていることになります)。

例としてパターン"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回か1回+"l"となりますのでマッチしません。

サンプルプログラム

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

JSample5_1.java

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

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

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

p5-1

( Written by Tatsuo Ikura )