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

Java MatcherクラスのhasAnchoringBounds()メソッドの使い方とサンプルコード

java.util.regex.Matcher クラスは、正規表現パターンに対してさまざまなマッチ操作を実行するエンジンを表すクラスです。このクラスにはコンストラクタが定義されていないため、java.util.regex.Pattern クラスの matcher() メソッドを呼び出してオブジェクトを取得します。

「アンカリング境界(anchoring bounds)」とは、^(先頭)や $(末尾)といったアンカーが、検索領域(region)の境界に対してどのように扱われるかを決める設定です。デフォルトでは Matcher はアンカリング境界を使用するようになっており、useAnchoringBounds() メソッドを使えば、アンカリング境界と非アンカリング境界を切り替えることができます。

Matcher クラスの hasAnchoringBounds() メソッドは、現在のマッチャーがアンカリング境界を使用しているかどうかを調べるメソッドです。使用している場合は true を、そうでなければ false を返します。

アンカリング境界と非アンカリング境界の違い

  • アンカリング境界(true/デフォルト)^$ は入力全体の先頭・末尾にのみマッチし、検索領域の境界ではマッチしません。
  • 非アンカリング境界(false)^$ が検索領域の境界にもマッチするようになります。

例1:デフォルト状態でアンカリング境界を確認する

import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class HasAnchoringBoundsExample {
    public static void main(String[] args) {
        String regex = "(.*)(\\d+)(.*)";
        String input = "This is a sample Text, 1234, with numbers in between. "
            + "\n This is the second line in the text "
            + "\n This is third line in the text";
        // Patternオブジェクトを作成
        Pattern pattern = Pattern.compile(regex);
        // Matcherオブジェクトを作成
        Matcher matcher = pattern.matcher(input);
        // アンカリング境界の設定を確認
        boolean bool = matcher.hasAnchoringBounds();
        if(bool) {
            System.out.println("現在のマッチャーはアンカリング境界を使用しています");
        } else {
            System.out.println("現在のマッチャーは非アンカリング境界を使用しています");
        }
        // マッチの判定
        if(matcher.matches()) {
            System.out.println("マッチが見つかりました");
        } else {
            System.out.println("マッチが見つかりませんでした");
        }
    }
}

実行結果

現在のマッチャーはアンカリング境界を使用しています
マッチが見つかりませんでした

この例では、入力文字列に改行が含まれています。matches() は入力全体との一致を要求しますが、デフォルトでは . が改行にマッチしないため、結果としてマッチは見つかりません。

例2:useAnchoringBounds()で切り替えて確認する

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("入力文字列を入力してください");
        String input = sc.nextLine();
        // 数字を検索するための正規表現
        String regex = ".*\\d+.*";
        // 正規表現をコンパイル
        Pattern pattern = Pattern.compile(regex);
        // コンパイル済みの正規表現を出力
        System.out.println("コンパイルされた正規表現: " + pattern.toString());
        // Matcherオブジェクトを取得
        Matcher matcher = pattern.matcher(input);
        // 非アンカリング境界へ切り替え
        matcher.useAnchoringBounds(false);
        boolean hasBounds = matcher.hasAnchoringBounds();
        if(hasBounds) {
            System.out.println("現在のマッチャーはアンカリング境界を使用しています");
        } else {
            System.out.println("現在のマッチャーは非アンカリング境界を使用しています");
        }
        // マッチしたかどうかを確認
        if(matcher.matches()) {
            System.out.println("入力された文字列には数字が含まれています");
        } else {
            System.out.println("入力された文字列には数字が含まれていません");
        }
    }
}

実行結果

入力文字列を入力してください
hello sample 2
コンパイルされた正規表現: .*\d+.*
現在のマッチャーは非アンカリング境界を使用しています
入力された文字列には数字が含まれています

このように、useAnchoringBounds(false) を呼び出した後は、hasAnchoringBounds()false を返すことが確認できます。リージョン内で ^$ を境界として扱いたい場合に、非アンカリング境界への切り替えが役立ちます。

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