否定の先読み

広告

先読みには否定の先読みも用意されています。否定の先読みを行うパターンは"(?!"から")"の間に記述します。

"パターン(?!先読みパターン)"
"(?!先読みパターン)パターン"

この場合は、先読みパターンに記載したパターンに一致しない場合に"(?!先読みパターン)"の部分がマッチします。

まず先読みパターンの場合の例を考えてみます。

ターゲット文字列
"ColorBlack is #000000"
"ColorBlue is #0000ff"

パターン
"Color(?=Black)B"

通常の先読みパターンであれば、"Color"の後に"B"が続くもので条件として"B"は"Black"と続くものという意味になりますので、"ColorBlack is #000000"にはマッチしますが"ColorBlue is #0000ff"にはマッチしません。

続いて否定の先読みパターンの場合の例を考えてみます。

ターゲット文字列
"ColorBlack is #000000"
"ColorBlue is #0000ff"

パターン
"Color(?!Black)B"

否定の先読みパターンであれば"、"Color"の後に"B"が続くもので条件として"B"は"Black"以外のものという意味になりますので、ColorBlack is #000000"にはマッチしませんが"ColorBlue is #0000ff"にはマッチします。

例えば次のような使い方ができます。

"(?!0000)¥d¥d¥d¥d"

上記のパターンでは、"0000"ではない4桁の数字にマッチします。

なお先読みも否定先読みも位置にマッチするものなので、次のように複数の先読みパターンを記述することができます。

"(?!0000)(?!9999)¥d¥d¥d¥d"

上記のパターンでは、"0000"及び"9999"ではない4桁の数字にマッチします。

サンプルプログラム

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

JSample2_1.java

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

class JSample2_1{
  public static void main(String args[]){
    String str1 = "No.8710";
    String str2 = "No.0000";

    String regex1 = "¥¥d¥¥d¥¥d¥¥d";
    Pattern p1 = Pattern.compile(regex1);

    String regex2 = "(?!0000)¥¥d¥¥d¥¥d¥¥d";
    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);
    }
  }
}

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

p2-1

( Written by Tatsuo Ikura )