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

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


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

MatcherクラスのusePattern()メソッドは、新しい正規表現パターンを表すPatternオブジェクトを引数に受け取り、以降のマッチ検索にそのパターンを使用するよう切り替えるメソッドです。これにより、同じ入力文字列に対して異なるパターンでの検索を、Matcherオブジェクトを作り直すことなく実行できます。

usePattern()メソッドの使用例

次のサンプルでは、まず入力文字列に含まれる特殊文字(# % & *)の個数をカウントし、その後usePattern()メソッドで「全体が6〜15文字の単語構成文字で構成されているか」を判定するパターンへ切り替えています。

import java.util.Scanner;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class UsePatternExample {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.println("Enter input text: ");
        String input = sc.nextLine();
        String regex = "[#%&*]";
        // パターンオブジェクトの作成
        Pattern pattern = Pattern.compile(regex);
        // Matcherオブジェクトの作成
        Matcher matcher = pattern.matcher(input);
        int count = 0;
        while(matcher.find()) {
            count++;
        }
        // カウント結果の出力
        System.out.println("The are "+count+" special characters [# % & *] in the given text");
        // 6〜15文字の入力を受け付けるパターンを構築
        Pattern newPattern = Pattern.compile("\\A(?=\\w{6,15}\\z)");
        // 新しいパターンへ切り替え
        matcher = matcher.usePattern(newPattern);
        if(matcher.find()) {
            System.out.println("Given input contain 6 to 15 characters");
        } else {
            System.out.println("Given input doesn't contain 6 to 15 characters");
        }
    }
}

実行結果

Enter input text:
#*mypassword&
The are 3 special characters [# % & *] in the given text
!!mypassword!
Given input doesn't contain 6 to 15 characters

コードの解説

プログラムの処理の流れは以下のとおりです。

  1. Scannerでユーザーから入力文字列を受け取ります。
  2. 正規表現「[#%&*]」をPattern.compile()でコンパイルし、matcher()メソッドでMatcherオブジェクトを生成します。
  3. find()メソッドをwhileループで繰り返し呼び出し、特殊文字の出現回数をカウントします。
  4. Pattern.compile("\\A(?=\\w{6,15}\\z)")により、文字列の先頭(\A)から末尾(\z)までが6〜15文字の単語構成文字(英数字・アンダースコア)で構成されていることを確認する先読みパターンを作成します。
  5. usePattern()メソッドで新しいパターンに切り替え、find()メソッドの結果に応じて判定メッセージを出力します。

usePattern()メソッドのポイント

  • 既存のMatcherオブジェクトに新しいPatternを適用できるため、同一の入力に対して複数のパターンで検索したい場合に便利です。
  • このメソッドを呼び出すと、直前のマッチに関する情報は失われ、検索領域(リージョン)はデフォルトの状態にリセットされます。
  • 戻り値としてMatcher自身が返されるため、メソッドチェーン形式で記述することも可能です。

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