【Java】正規表現のメタ文字\B(非単語境界)の使い方をサンプルコードで解説
Javaの正規表現におけるメタ文字「\B」は、単語境界以外の位置(非単語境界)にマッチします。この記事では、\Bの基本的な意味と、サンプルコードによる具体的な動作をわかりやすく解説します。
メタ文字\Bとは
正規表現の\bは「単語境界」、すなわち単語文字([a-zA-Z_0-9])とそれ以外の文字の境目にある位置にマッチします。\Bはその逆で、次のような単語境界になっていない位置にマッチします。
- 単語文字と単語文字の間(例:「ab」の「a」と「b」の間)
- 非単語文字と非単語文字の間(例:「!@」の「!」と「@」の間)
また、\Bはゼロ幅アサーションと呼ばれる種類のパターンのため、マッチしても文字そのものを消費せず、位置の判定だけを行います。
サンプルコード1:「\Bcause」パターンでマッチ数を数える
次の例では、パターン「\Bcause」を使い、入力された文字列の中に「単語の途中から始まる cause」がいくつあるかを数えます。
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class RegexExample {
public static void main(String args[]) {
String regex = "\\Bcause";
Scanner sc = new Scanner(System.in);
System.out.println("文字列を入力してください:");
String input = sc.nextLine();
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
int count = 0;
while(m.find()) {
count++;
}
System.out.println("マッチした件数: " + count);
}
}
実行結果
文字列を入力してください: A sentence doesn't end with because because, because is a conjunction マッチした件数: 3
解説
入力された文章には「because」という単語が3回含まれています。「\Bcause」というパターンは、「cause」の直前の位置が単語境界でない場合、つまり「cause」のすぐ前に別の単語文字が存在する場合にだけマッチします。
「because」の中の「cause」は、直前に「e」という単語文字があるため、3回ともマッチ対象となり、結果は「3」と出力されます。
サンプルコード2:「\B」だけで非単語境界の総数を数える
パターンとして「\B」単独を指定すると、入力文字列中に存在するすべての非単語境界の位置を数えることができます。
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main(String args[]) {
System.out.println("文字列を入力してください:");
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
String regex = "\\B";
// 正規表現をコンパイル
Pattern pattern = Pattern.compile(regex);
// Matcherオブジェクトを取得
Matcher matcher = pattern.matcher(input);
int count = 0;
System.out.println("非単語境界の数:");
while(matcher.find()) {
count++;
}
System.out.println(count);
}
}
実行結果
文字列を入力してください: Hello how are you welcome to Tutorialspoint 非単語境界の数: 30
解説
入力文字列「Hello how are you welcome to Tutorialspoint」の場合、各単語内で文字と文字が隣り合っている位置がすべて非単語境界に該当します。
たとえば「Hello」なら内部に4つの隣接位置があり、これを全単語分合計すると30箇所となり、実行結果と一致します。
まとめ
\Bは「単語境界以外の位置」にマッチするメタ文字です。\b(単語境界)とセットで覚えると理解しやすくなります。- ゼロ幅アサーションなので、マッチしても文字を消費しません。
- デフォルトでは半角英数字とアンダースコアが単語文字として扱われるため、日本語などを対象にする場合は
UNICODE_CHARACTER_CLASSフラグの指定などに注意が必要です。
-
Javaの正規表現における$(ドル)メタ文字の使い方
正規表現におけるサブ表現(メタ文字)「$」は、行の末尾に一致します。パターンの最後に「$」を置くことで、指定した文字列で終わるテキストだけをマッチさせることができます。なお、デフォルトでは「$」は入力全体の末尾に一致しますが、Pattern.MULTILINEフラグを有効にすると、行区切り文字(改行など)の直前にも一致するようになります。例1:行末の一致を確認する次のJavaプログラムでは、「Tutorialspoint」という文字列で終わる入力に対して、正規表現「Tutorialspoint$」が何回一致するかを数えています。import java.util.regex.Matcher; i
-
Java正規表現のメタ文字「^(キャレット)」の使い方を解説
正規表現におけるサブ式(メタ文字)「^」は、行の先頭にマッチします。この記号を正規表現の中で使用すると、入力文字列の中でその後に続くパターンが行頭から始まる場合に一致とみなされます。 例1:行頭のパターンにマッチするか確認する 次のサンプルコードでは、入力文字列が「Hi how are you」というフレーズで始まっているかどうかを「^」を使って判定しています。 import java.util.regex.Matcher; import java.util.regex.Pattern; public class RegexExample { public static void m