Java MatcherクラスのhasTransparentBounds()メソッドの使い方を実例付きで解説
java.util.regex.Matcher クラスは、文字列に対してさまざまなマッチ操作を実行するエンジンを表すクラスです。このクラスにはコンストラクタが用意されておらず、java.util.regex.Pattern クラスの matcher() メソッドを使ってオブジェクトを取得します。
透過的な境界(Transparent Bounds)とは
正規表現では、先読み(lookahead)や後読み(lookbehind)といった構成要素を使うことで、あるパターンの前後にある特定のパターンを条件としてマッチさせることができます。たとえば、6〜10文字の英数字を受け入れる正規表現は次のように記述します。
"\\A(?=\\w{6,10}\\z)";
デフォルトでは、マッチャーのリージョン(検索対象範囲)の境界は不透明(non-transparent)に設定されています。つまり、先読み・後読み・境界マッチングの各構成要素は、リージョンの境界を越えて入力テキストの内容を参照することができません。
hasTransparentBounds() メソッドは、現在のマッチャーが透過的な境界を使用しているかどうかを確認するためのメソッドです。透過的な境界が有効であれば true、そうでなければ false を返します。
動作のポイント
- デフォルト状態では
falseを返す(境界は不透明) useTransparentBounds(true)を呼び出すと、リージョン外のテキストも先読み・後読みの判定対象になる- リージョンを設定した場合にマッチ結果が変わるかどうかを確認する際に役立つ
サンプルコード1:デフォルト(不透明な境界)の場合
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HasTransparentBounds {
public static void main(String[] args) {
// 6〜10文字を受け入れる正規表現
String regex = "\\A(?=\\w{6,10}\\z)";
System.out.println("Enter 5 to 12 characters: ");
String input = new Scanner(System.in).next();
// Patternオブジェクトの作成
Pattern pattern = Pattern.compile(regex);
// Matcherオブジェクトの作成
Matcher matcher = pattern.matcher(input);
// 入力文字列にリージョンを設定
matcher.region(0, 4);
if(matcher.find()) {
System.out.println("Match found");
} else {
System.out.println("Match not found");
}
boolean bool = matcher.hasTransparentBounds();
if(bool) {
System.out.println("Current matcher uses transparent bounds");
} else {
System.out.println("Current matcher user non-transparent bound");
}
}
}
実行結果
Enter 5 to 12 characters: sampletext Match not found Current matcher user non-transparent bound
この例では、リージョンを (0, 4) に設定しているため、マッチャーは最初の4文字「samp」しか見ることができません。境界が不透明なため、先読み (?=\w{6,10}\z) がリージョン外の残りの文字を確認できず、マッチは失敗します。
サンプルコード2:useTransparentBounds(true) を使った場合
import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HasTransparentBounds {
public static void main(String[] args) {
// 6〜10文字を受け入れる正規表現
String regex = "\\A(?=\\w{6,10}\\z)";
System.out.println("Enter 5 to 12 characters: ");
String input = new Scanner(System.in).next();
// Patternオブジェクトの作成
Pattern pattern = Pattern.compile(regex);
// Matcherオブジェクトの作成
Matcher matcher = pattern.matcher(input);
// 入力文字列にリージョンを設定
matcher.region(0, 4);
// 透過的な境界に切り替え
matcher.useTransparentBounds(true);
if(matcher.find()) {
System.out.println("Match found");
} else {
System.out.println("Match not found");
}
boolean bool = matcher.hasTransparentBounds();
if(bool) {
System.out.println("Current matcher uses transparent bounds");
} else {
System.out.println("Current matcher user non-transparent bound");
}
}
}
実行結果
Enter 5 to 12 characters: sampletext Match found Current matcher uses transparent bounds
useTransparentBounds(true) を呼び出したことで、先読み構成要素がリージョンの境界を越えて入力全体(「sampletext」の10文字)を参照できるようになり、正規表現の条件を満たしてマッチに成功しました。
まとめ
hasTransparentBounds() メソッドは、マッチャーが透過的な境界を使用しているかどうかを boolean 値で返すシンプルな確認用メソッドです。リージョンを限定してマッチングを行う際、先読みや後読みが境界外のテキストまで考慮すべきかどうかを制御したいケースで、useTransparentBounds() と組み合わせて活用すると効果的です。
-
JavaのMatcher.matches()メソッドとは?使い方をサンプルコード付きで解説
java.util.regex.Matcherクラスは、正規表現を用いたさまざまなマッチ操作を実行するエンジンを表すクラスです。このクラスにはコンストラクタが用意されておらず、java.util.regex.Patternクラスのmatcher()メソッドを使ってオブジェクトを取得します。 matches()メソッドは、対象の文字列全体が、Patternオブジェクトの作成時に指定された正規表現パターンと一致するかどうかを判定します。一致する場合はtrueを返し、一致しない場合はfalseを返します。重要なポイントとして、このメソッドがtrueを返すためには、検索対象の領域全体がパターンに一致し
-
JavaのMatcherクラスstart()メソッドとは?サンプルコード付きで解説
java.util.regex.Matcherクラスは、正規表現を用いたさまざまなマッチ操作を実行するエンジンを表すクラスです。このクラスにはコンストラクタが用意されておらず、java.util.regex.Patternクラスのmatcher()メソッドを使用することで、Matcherオブジェクトを取得できます。 Matcherクラスのstart()メソッドは、直前にマッチした文字列の開始インデックス(先頭からの位置)をint型で返します。 start()メソッドの基本的な動作 正規表現における文字クラス「[...]」は、括弧内に指定したいずれか1文字に一致します。以下の例では、この文字クラ