単語境界/非単語境界(¥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"にマッチする以外の位置にマッチします。

サンプルプログラム

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

JSample5_1.java

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

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

p5-1

"?"や"."などは単語の構成する文字ではない点に注意して下さい。

( Written by Tatsuo Ikura )