Java正規表現のメタ文字「\b」(単語境界)の使い方を解説
Javaの正規表現におけるメタ文字(部分表現)「\b」は、括弧の外で使用した場合に単語の境界にマッチします。一方、括弧([ ])の中で使用した場合は、バックスペース文字(0x08)にマッチするという異なる動作になります。
単語境界とは
単語境界とは、単語を構成する文字(英数字やアンダースコアなど)と、それ以外の文字(空白記号や句読点など)との間にある位置のことです。例えば、「because」という単語を検索する際に「\bbecause\b」と指定すると、「because」という完全な単語だけがマッチし、「because」を含む他の単語(例:becauses)にはマッチしません。
例1:特定の単語の出現回数をカウントする
次のJavaプログラムでは、ユーザーから入力された文字列の中に「because」という単語が何回出現するかをカウントします。
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 = "\\bbecause\\b";
Scanner sc = new Scanner(System.in);
System.out.println("Enter a string: ");
String input = sc.nextLine();
Pattern p = Pattern.compile(regex);
Matcher m = p.matcher(input);
int count = 0;
while(m.find()) {
count ++;
}
System.out.println("Number of matches: "+count);
}
}実行結果
Enter a string: A sentence doesn't end with because because, because is a conjunction Number of matches: 3
この例では、入力された文章の中に「because」という単語が3回含まれているため、マッチ数として「3」が出力されています。単語境界「\b」を使用することで、部分的な一致ではなく完全な単語としての一致のみを検出できる点がポイントです。
例2:単語境界の数をカウントする
次のJavaプログラムは、ユーザーから文字列を読み込み、その文字列内に存在する単語境界の総数を出力します。
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("Enter input string: ");
Scanner sc = new Scanner(System.in);
String input = sc.nextLine();
String regex = "\\b";
//Compiling the regular expression
Pattern pattern = Pattern.compile(regex);
//Retrieving the matcher object
Matcher matcher = pattern.matcher(input);
int count =0;
while(matcher.find()) {
count ++;
}
System.out.println(count);
}
}実行結果
Enter input string: Hello how are you welcome to Tutorialspoint 14
この例では、7つの単語からなる文字列に対して14個の単語境界が検出されています。これは、各単語の前後に1つずつ境界が存在するためです。この性質を利用すると、単語数の概算などにも活用できます。
まとめ
- 「\b」は括弧の外では単語境界にマッチする
- 括弧([ ])の中ではバックスペース(0x08)にマッチする
- Javaのコード内で正規表現として使用する場合は「\\b」とエスケープが必要
- 特定の単語を完全一致で検索したい場合に非常に便利
-
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