- Home ›
- Java正規表現の使い方 ›
- 先読みと後読み ›
- HERE
否定の先読み
先読みには否定の先読みも用意されています。否定の先読みを行うパターンは"(?!"から")"の間に記述します。
"パターン(?!先読みパターン)" "(?!先読みパターン)パターン"
この場合は、先読みパターンに記載したパターンに一致しない場合に"(?!先読みパターン)"の部分がマッチします。
まず先読みパターンの場合の例を考えてみます。
ターゲット文字列 "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桁の数字にマッチします。
サンプルプログラム
では実際に試してみます。
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); } } }
ではコンパイルを行った上で実行してみます。
( Written by Tatsuo Ikura )