Java正規表現のMatcherクラスメソッド徹底解説

Matcherクラスの主要メソッド

Javaの正規表現において、Matcherクラスはパターンと入力文字列の間のマッチングを実行するために使用されます。このクラスには、文字列の検索、置換、マッチング位置の特定など、多くの便利なメソッドが用意されています。

インデックス関連メソッド

インデックスメソッドは、入力文字列内のマッチング位置を示す有用なインデックス値を提供します:

番号 メソッドと説明
1 public int start()
前回のマッチの開始インデックスを返します。
2 public int start(int group)
前回のマッチ操作中に指定されたグループによってキャプチャされた部分シーケンスの開始インデックスを返します。
3 public int end()
最後のマッチ文字の後のオフセットを返します。
4 public int end(int group)
前回のマッチ操作中に指定されたグループによってキャプチャされた部分シーケンスの最後の文字の後のオフセットを返します。

検索メソッド

検索メソッドは、入力文字列を検索し、パターンが見つかったかどうかを示すブール値を返します:

番号 メソッドと説明
1 public boolean lookingAt()
領域の先頭から始まる入力シーケンスとこのパターンをマッチングしようと試みます。
2 public boolean find()
このパターンに一致する入力シーケンスの次の部分シーケンスを見つけようと試みます。
3 public boolean find(int start)
このマッチャーをリセットし、指定されたインデックスから始まる入力シーケンスでパターンに一致する次の部分シーケンスを見つけようと試みます。
4 public boolean matches()
領域全体をパターンとマッチングしようと試みます。

置換メソッド

置換メソッドは、入力文字列内のテキストを置換するために使用されます:

番号 メソッドと説明
1 public Matcher appendReplacement(StringBuffer sb, String replacement)
非終端追加と置換ステップを実装します。
2 public StringBuffer appendTail(StringBuffer sb)
終端追加と置換ステップを実装します。
3 public String replaceAll(String replacement)
パターンと指定された置換文字列に一致する入力シーケンスのすべての部分シーケンスを置換します。
4 public String replaceFirst(String replacement)
パターンと指定された置換文字列に一致する入力シーケンスの最初の部分シーケンスを置換します。
5 public static String quoteReplacement(String s)
指定された文字列のリテラル置換文字列を返します。このメソッドは、MatcherクラスのappendReplacementメソッドにリテラル文字列を渡す場合と同様に動作する文字列を返します。

start()とend()メソッドの使用例

以下の例では、単語"cat"が入力文字列内に何回出現するかを数えます:

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

public class RegexMatches {
    private static final String REGEX = "\\bcat\\b";
    private static final String INPUT = "cat cat cat cattie cat";
    
    public static void main(String[] args) {
        Pattern p = Pattern.compile(REGEX);
        Matcher m = p.matcher(INPUT);
        int count = 0;
        
        while(m.find()) {
            count++;
            System.out.println("マッチ番号 " + count);
            System.out.println("start(): " + m.start());
            System.out.println("end(): " + m.end());
        }
    }
}

上記のコードの実行結果:

マッチ番号 1
start(): 0
end(): 3
マッチ番号 2
start(): 4
end(): 7
マッチ番号 3
start(): 8
end(): 11
マッチ番号 4
start(): 19
end(): 22

この例では、単語境界を使用して、文字"c"、"a"、"t"がより長い単語の部分文字列でないことを確認しています。また、入力文字列内のマッチングが発生する位置に関する有用な情報も提供しています。

start()メソッドは、前回のマッチ操作中に指定されたグループによってキャプチャされた部分シーケンスの開始インデックスを返し、end()メソッドは最後のマッチ文字のインデックスに1を加えた値を返します。

matches()とlookingAt()メソッド

matches()とlookingAt()メソッドの両方とも、入力シーケンスのパターンとのマッチングを試みます。これらのメソッドの違いは、matches()はシーケンス全体が一致することを要求するのに対し、lookingAt()はそれを要求しない点です。

lookingAt()メソッドは、文全体が一致する必要はありませんが、最初の文字から一致を開始する必要があります。

これらのメソッドは通常、入力文字列の先頭で使用されます。

以下の例でこの機能を説明します:

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

public class RegexMatches {
    private static final String REGEX = "foo";
    private static final String INPUT = "fooooooooooooooooo";
    private static final String INPUT2 = "ooooofoooooooooooo";
    private static Pattern pattern;
    private static Matcher matcher;
    private static Matcher matcher2;
    
    public static void main(String[] args) {
        pattern = Pattern.compile(REGEX);
        matcher = pattern.matcher(INPUT);
        matcher2 = pattern.matcher(INPUT2);
        
        System.out.println("現在のREGEX: " + REGEX);
        System.out.println("現在のINPUT: " + INPUT);
        System.out.println("現在のINPUT2: " + INPUT2);
        System.out.println("lookingAt(): " + matcher.lookingAt());
        System.out.println("matches(): " + matcher.matches());
        System.out.println("lookingAt(): " + matcher2.lookingAt());
    }
}

上記のコードの実行結果:

現在のREGEX: foo
現在のINPUT: fooooooooooooooooo
現在のINPUT2: ooooofoooooooooooo
lookingAt(): true
matches(): false
lookingAt(): false

replaceFirst()とreplaceAll()メソッド

replaceFirst()とreplaceAll()メソッドは、正規表現に一致するテキストを置換するために使用されます。違いは、replaceFirst()は最初に一致したものを置換し、replaceAll()はすべての一致を置換する点です。

以下の例でこの機能を説明します:

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

public class RegexMatches {
    private static String REGEX = "dog";
    private static String INPUT = "The dog says meow. All dogs say meow.";
    private static String REPLACE = "cat";
    
    public static void main(String[] args) {
        Pattern p = Pattern.compile(REGEX);
        Matcher m = p.matcher(INPUT);
        INPUT = m.replaceAll(REPLACE);
        System.out.println(INPUT);
    }
}

上記のコードの実行結果:

The cat says meow. All cats say meow.

appendReplacement()とappendTail()メソッド

Matcherクラスは、テキスト置換のためにappendReplacement()とappendTail()メソッドも提供しています:

以下の例でこの機能を説明します:

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

public class RegexMatches {
    private static String REGEX = "a*b";
    private static String INPUT = "aabfooaabfooabfoobkkk";
    private static String REPLACE = "-";
    
    public static void main(String[] args) {
        Pattern p = Pattern.compile(REGEX);
        Matcher m = p.matcher(INPUT);
        StringBuffer sb = new StringBuffer();
        
        while(m.find()){
            m.appendReplacement(sb, REPLACE);
        }
        m.appendTail(sb);
        System.out.println(sb.toString());
    }
}

上記のコードの実行結果:

-foo-foo-foo-kkk

PatternSyntaxExceptionクラスのメソッド

PatternSyntaxExceptionは、正規表現パターン内の構文エラーを示す非強制例外クラスです。

PatternSyntaxExceptionクラスは、どのようなエラーが発生したかを確認するための以下のメソッドを提供しています:

番号 メソッドと説明
1 public String getDescription()
エラーの説明を取得します。
2 public int getIndex()
エラーのインデックスを取得します。
3 public String getPattern()
エラーの正規表現パターンを取得します。
4 public String getMessage()
構文エラーとそのインデックスの説明、エラーの正規表現パターン、パターン内のエラーインデックスの視覚的指示を含む複数行の文字列を返します。

タグ: Java 正規表現 Matcherクラス Patternクラス 正規表現API

6月28日 18:05 投稿