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

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

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

アンカリング境界(anchoring bounds)とは、^$といったアンカーが、マッチ対象のリージョン(region)の先頭・末尾に対して一致するかどうかを制御するための設定です。デフォルトでは、Matcherはアンカリング境界を使用するように構成されています。

useAnchoringBounds()メソッドはboolean型の値を受け取ります。trueを渡した場合は現在のマッチャーがアンカリング境界を使用し、falseを渡した場合は非アンカリング境界を使用するようになります。現在の設定状態を確認したい場合は、hasAnchoringBounds()メソッドを併用すると便利です。

例1:useAnchoringBounds(false)で非アンカリング境界に切り替える

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Trail {
    public static void main( String args[] ) {
        // 入力文字列を読み込む
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter input string");
        String input = sc.nextLine();
        // 数字を検索するための正規表現
        String regex = ".*\\d+.*";
        // 正規表現をコンパイル
        Pattern pattern = Pattern.compile(regex);
        // コンパイル済みの正規表現を出力
        System.out.println("Compiled regular expression: "+pattern.toString());
        // マッチャーオブジェクトを取得
        Matcher matcher = pattern.matcher(input);
        matcher.useAnchoringBounds(false);
        boolean hasBounds = matcher.hasAnchoringBounds();
        if(hasBounds) {
            System.out.println("Current matcher uses anchoring bounds");
        } else {
            System.out.println("Current matcher uses non-anchoring bounds");
        }
    }
}

実行結果

Enter input string
sample
Compiled regular expression: .*\d+.*
Current matcher uses non-anchoring bounds

この例では、useAnchoringBounds(false)を呼び出した直後にhasAnchoringBounds()で状態を確認しており、falseが返されていることから、マッチャーが非アンカリング境界モードに切り替わったことがわかります。

例2:matches()メソッドとの組み合わせ

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Sample {
    public static void main( String args[] ) {
        String regex = "^<foo>.*";
        String input = "<foo><bar>";
        Pattern pattern = Pattern.compile(regex);
        Matcher matcher = pattern.matcher(input);
        matcher = matcher.useAnchoringBounds(false);
        if(matcher.matches()) {
            System.out.println("Match found");
        } else {
            System.out.println("Match not found");
        }
        System.out.println("Has anchoring bounds: "+matcher.hasAnchoringBounds());
    }
}

実行結果

Match found
Has anchoring bounds: false

この例では、^を含む正規表現に対してuseAnchoringBounds(false)を適用し、その後matches()でマッチ判定を行っています。戻り値として自分自身(Matcherインスタンス)が返されるため、メソッドチェーンのように受け取ることも可能です。

まとめ

  • useAnchoringBounds(true):アンカリング境界を使用する(これがデフォルト動作)
  • useAnchoringBounds(false):非アンカリング境界を使用する
  • hasAnchoringBounds():現在の境界設定をboolean値で確認できる

リージョンベースのマッチングを行う際に^$の挙動を細かく制御したいケースでは、本メソッドの理解が役立ちます。

  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文字に一致します。以下の例では、この文字クラ