- Home ›
- Java正規表現の使い方 ›
- 位置の指定 ›
- HERE
単語境界/非単語境界(¥b, ¥B)
文字列の中の単語の境界にマッチするパターンを記述するにはメタ文字の1つである"¥b"を使います。
書式は次の通りです。
"¥bパターン" "パターン¥b"
パターンには"¥b"を除いたパターンを記述します。
単語の境界というのは、単語を構成する文字(a-z、A-Z、0-9、_、Unicode文字)とそうでない文字との境目のことです。次の例を見て下さい。
How are you?
上記の場合で言えば、次の箇所が単語の境界にあたります
行頭と"H"の間 "w"と空白の間 空白と"a"の間 "e"と空白の間 空白と"y"の間 "u"と"?"の間
"¥b"は単語の境界にマッチします。Javaの場合は単語の前や後に関わらず"¥b"にマッチする点に注意して下さい。
具体的な例で考えてみます。"How are you?"と言う2つの文字列に対してパターンを"¥bar"と指定した場合には単語の境界から始まり"ar"と続くかどうかなのでマッチします。
○ How are you?
同じように"How are you?"と言う2つの文字列に対してパターンを"you¥b"と指定した場合には"you"と続いた後で単語の境界が出現するかどうかなのでマッチします。
○ How are you?
具体的には次のように記述します。
String str = "How are you?"; String regex = "¥¥byou"; Pattern p = Pattern.compile(regex); Matcher m = p.matcher(str); if (m.find()){ System.out.println("マッチしました"); }else{ System.out.println("マッチしません"); }
上記の場合はマッチします。
非単語境界
"¥b"が単語の境界にマッチするのに対して、"¥B"は単語の境界以外にマッチします。
書式は次の通りです。
"¥Bパターン" "パターン¥B"
パターンには"¥B"を除いたパターンを記述します。
"¥b"にマッチする以外の位置にマッチします。
サンプルプログラム
では実際に試してみます。
import java.util.regex.Pattern; import java.util.regex.Matcher; class JSample5_1{ public static void main(String args[]){ String str1 = "How are you?"; String str2 = "Howareyou?"; String regex1 = "¥¥bar"; Pattern p1 = Pattern.compile(regex1); String regex2 = "¥¥Bar"; Pattern p2 = Pattern.compile(regex2); String regex3 = "you¥¥b"; Pattern p3 = Pattern.compile(regex3); String regex4 = "¥¥bHow"; Pattern p4 = Pattern.compile(regex4); System.out.println("パターン : " + regex1); check(p1, str1); check(p1, str2); System.out.println("パターン : " + regex2); check(p2, str1); check(p2, str2); System.out.println("パターン : " + regex3); check(p3, str1); check(p3, str2); System.out.println("パターン : " + regex4); check(p4, str1); check(p4, str2); } 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); } } }
ではコンパイルを行った上で実行してみます。
"?"や"."などは単語の構成する文字ではない点に注意して下さい。
( Written by Tatsuo Ikura )