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

広告

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

書式は次の通りです。

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

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

"X+"は直前の文字である"X"が1回以上繰り返したものにマッチします。1回以上というのは"X"や"XXX"など"X"が1回以上繰り返されている文字マッチするということになります。"*"と異なり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"が1回以上+"l"となりますのでマッチします。

サンプルプログラム

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

JSample4_1.java

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

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

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

p4-1

( Written by Tatsuo Ikura )