Java
 Computer >> コンピューター >  >> プログラミング >> Java

JavaのMatcherクラスuseTransparentBounds()メソッドの使い方をサンプルコードで解説

java.util.regex.Matcherクラスは、正規表現による各種マッチ操作を実行するエンジンを表すクラスです。このクラスにはコンストラクタが用意されておらず、java.util.regex.Patternクラスのmatcher()メソッドを使ってMatcherオブジェクトを取得します。

正規表現には「先読み(lookahead)」と「後読み(lookbehind)」と呼ばれる構成要素があり、これらを使うことで、別のパターンの前後に存在する特定のパターンを条件としてマッチ処理を行うことができます。例えば、6文字以上10文字以内の文字列だけを受け入れたい場合、正規表現は次のように記述します。

"\\A(?=\\w{6,10}\\z)"

リージョン境界の「不透明性」とは

デフォルト設定では、マッチャーのリージョン(検索対象範囲)の境界は、先読み・後読み・境界マッチといった構成要素に対して不透明(opaque)になっています。つまり、これらの構成要素はリージョン境界の外側にある入力テキストを参照できず、境界をまたいだマッチングは行えません。

例1: デフォルト(不透明な境界)の場合

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class useTransparentBoundsExample {
    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);
        // リージョンを先頭から4文字に設定
        matcher.region(0, 4);
        if (matcher.find()) {
            System.out.println("Match found");
        } else {
            System.out.println("Match not found");
        }
    }
}

出力結果

Enter 5 to 12 characters:
sampleText
Match not found

この例では、region(0, 4)によって検索範囲を先頭から4文字に限定しています。リージョン境界が不透明なため、先読み(?=\w{6,10}\z)は境界の外側にある残りの文字を確認できず、文字数チェックが失敗して「Match not found」と表示されます。

useTransparentBounds()メソッドとは

MatcherクラスのuseTransparentBounds()メソッドは、boolean値を引数として受け取ります。trueを渡すとマッチャーは透過的な境界(transparent bounds)を使用し、falseを渡すと不透明な境界(non-transparent bounds)を使用します。透過的な境界を有効にすると、先読みや後読みなどの構成要素がリージョン境界を超えて入力テキストを参照できるようになります。

例2: 透過的な境界を有効にした場合

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class Example {
    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);
        // リージョンを先頭から4文字に設定
        matcher.region(0, 4);
        // 透過的な境界に切り替え
        matcher = matcher.useTransparentBounds(true);
        if (matcher.find()) {
            System.out.println("Match found");
        } else {
            System.out.println("Match not found");
        }
    }
}

出力結果

Enter 5 to 12 characters:
sampletext
Match found

useTransparentBounds(true)を呼び出すことで、リージョンが先頭4文字に制限されていても、先読みが入力全体を参照できるようになります。その結果、「sampletext」(10文字)が\w{6,10}の条件を満たし、「Match found」と出力されます。

まとめ

useTransparentBounds()メソッドを使い分けることで、リージョンを限定しながらも、先読み・後読みによる文字数チェックや文脈の参照を正しく行えるようになります。部分文字列だけを検証したい場合でも、周辺のコンテキストを考慮したマッチングが必要な場面で特に役立つメソッドです。

  1. JavaのMatcher.matches()メソッドとは?使い方をサンプルコード付きで解説

    java.util.regex.Matcherクラスは、正規表現を用いたさまざまなマッチ操作を実行するエンジンを表すクラスです。このクラスにはコンストラクタが用意されておらず、java.util.regex.Patternクラスのmatcher()メソッドを使ってオブジェクトを取得します。 matches()メソッドは、対象の文字列全体が、Patternオブジェクトの作成時に指定された正規表現パターンと一致するかどうかを判定します。一致する場合はtrueを返し、一致しない場合はfalseを返します。重要なポイントとして、このメソッドがtrueを返すためには、検索対象の領域全体がパターンに一致し

  2. JavaのMatcherクラスstart()メソッドとは?サンプルコード付きで解説

    java.util.regex.Matcherクラスは、正規表現を用いたさまざまなマッチ操作を実行するエンジンを表すクラスです。このクラスにはコンストラクタが用意されておらず、java.util.regex.Patternクラスのmatcher()メソッドを使用することで、Matcherオブジェクトを取得できます。 Matcherクラスのstart()メソッドは、直前にマッチした文字列の開始インデックス(先頭からの位置)をint型で返します。 start()メソッドの基本的な動作 正規表現における文字クラス「[...]」は、括弧内に指定したいずれか1文字に一致します。以下の例では、この文字クラ