Java正規表現(RegEx)で単語境界以外(\B)をマッチさせる方法
Javaの正規表現では、メタ文字「\B」を使用することで、単語境界以外の位置をマッチさせることができます。
単語境界以外(\B)とは?
「\B」は、単語構成文字(英数字やアンダースコア)と単語構成文字の間、または非単語構成文字と非単語構成文字の間など、単語の境界に該当しないすべての位置にマッチします。つまり、「\b」(単語境界)の否定にあたるメタ文字です。
例1:文中の単語境界以外の数をカウントする
次の例では、ユーザーから入力された文字列に対して「\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;
while(matcher.find()) {
count++;
}
System.out.println("単語境界以外の数: " + count);
}
}実行結果
文字列を入力してください this is a sample text 単語境界以外の数: 12
例2:「in」という文字列を含む単語境界以外を検索する
「\B」は他のパターンと組み合わせて使用することもできます。次の例では、「\Bin」というパターンを使用して、単語の途中(単語境界以外の位置)にある「in」の出現回数をカウントしています。
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Example {
public static void main( String args[] ) {
String regex = "\\Bin";
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);
}
}実行結果
文字列を入力してください: this is a sample text in win tin pin sin 単語境界以外の数: 4
解説
上記の入力例「this is a sample text in win tin pin sin」の場合、独立した単語としての「in」は単語境界に位置するためマッチしません。一方、「win」「tin」「pin」「sin」の中の「in」はそれぞれ単語の途中(w・t・p・s の直後)に位置しているため、合計4回マッチします。
このように「\B」を使うことで、単語の先頭や末尾ではなく、単語の内部に存在する特定のパターンだけを効率的に抽出できます。
-
Java正規表現(Regex)で固定文字セットにマッチさせる方法
Javaの正規表現における文字クラスを使うと、あらかじめ定義しておいた固定の文字集合の中から「任意の1文字」にマッチさせることができます。たとえば、次のように記述します。 [tmp]:t、m、p のいずれか1文字にマッチします。 [^tp]:t と p 以外の任意の1文字にマッチします(先頭に ^ を付けると否定を意味します)。 角括弧 [ ] 内に候補となる文字を列挙すると、入力文字列の各位置についてその中のどれか1つが存在すればマッチが成立します。この仕組みを利用すると、「特定の文字が文字列内に何回出現するか」を簡単に数えることができます。 例1:指定した文字の出現回数をカウントする
-
Java正規表現(RegEx)で任意の文字にマッチさせる方法
Javaの正規表現におけるメタ文字「.」(ドット)は、任意の1文字にマッチします。マッチ対象はアルファベットでも数字でも、記号などの特殊文字でも構いません。メタ文字「.」の基本「.」は改行文字以外のあらゆる単一文字と一致するため、パターンの柔軟性を高めたい場面で非常に便利です。なお、ドットそのもの(リテラルの「.」)にマッチさせたい場合は、バックスラッシュでエスケープして「\.」と記述します。例1:任意の1文字とのマッチ次のプログラムでは、ユーザーから入力された文字列に対して正規表現「.」を適用し、文字数をカウントしています。import java.util.Scanner; import j