- Home ›
 - Java正規表現の使い方 ›
 - 先読みと後読み ›
 - HERE
 
先読みを使ったパターン
先読みを行うパターンは"(?="から")"の間に記述します。
"パターン(?=先読みパターン)" "(?=先読みパターン)パターン"
先読みのパターンは、指定されたパターンがターゲット文字列に存在するかどうかを確認し、見つかった場合は見つかった文字列の先頭の位置にマッチします。つまり先読みのパターンは位置にマッチするパターンです。次の例を見てください。
ターゲット文字列 "ColorBlack is #000000" パターン "Color(?=Black)B"
この場合、まずパターンの中の"Color"がターゲット文字列の中の"Color"にマッチし、残るターゲット文字列は"Black is #000000"となります。
Color Black is #000000 ----- ---------------- Color
続いてパターンの中の"(?=Black)"がマッチするかどうか試します。残っているターゲット文字列は"Black is #000000"なのでマッチします。ここで通常のパターンであれば残るターゲット文字列は" is #000000"となるのですが先読みのパターンの場合は位置にマッチするだけなので、残っているターゲット文字列は"Black is #000000"のままです。
Color Black is #000000 ----- ----- ----------- Color Black
最後にパターンの中の"B"がマッチするかどうか試します。残っているターゲット文字列は"Black is #000000"なのでマッチします。
Color B lack is #000000 ----- - --------------- Color B
つまり"Color(?=Black)B"のパターンは、"Color"の後に"B"が続く文字列にマッチするが、条件として"B"の後には"Black"と続かなけばならないということです。
この時パターン全体にマッチした文字列は"ColorB"となります。先読みパターンの部分はあくまで位置にマッチしているだけのため、マッチした部分文字列には含まれてきません。
もしターゲット文字列が"ColorBlue is #0000FF"だったら、先読みパターンにマッチしないためパターン全体もマッチしません。またパターン文字列が"ColorB"だったらターゲット文字列が"ColorBlack is #000000"であっても"ColorBlue is #0000FF"であってもマッチします。
なお"Color(?=Black)B"は"(?=ColorBlack)ColorB"と記述しても同じことです。
サンプルプログラム
では実際に試してみます。
import java.util.regex.Pattern;
import java.util.regex.Matcher;
class JSample1_1{
  public static void main(String args[]){
    String str1 = "ColorBlack is #000000";
    String str2 = "ColorBlue is #0000ff";
    String regex1 = "ColorB";
    Pattern p1 = Pattern.compile(regex1);
    String regex2 = "Color(?=Black)B";
    Pattern p2 = Pattern.compile(regex2);
    System.out.println("パターン : " + regex1);
    check(p1, str1);
    check(p1, str2);
    System.out.println("パターン : " + regex2);
    check(p2, str1);
    check(p2, str2);
  }
  private static void check(Pattern p, String target){
    Matcher m = p.matcher(target);
    if (m.find()){
      System.out.println("○ " + target);
      System.out.println("   " + m.group());
    }else{
      System.out.println("× " + target);
    }
  }
}
			ではコンパイルを行った上で実行してみます。
			
			
( Written by Tatsuo Ikura )
				
JavaDrive