1. ホーム
  2. java

[解決済み] 正規表現のマッチ数を数えるにはどうすればよいですか?

2022-09-25 02:17:54

質問

例えば、以下のような文字列があるとします。

HelloxxxHelloxxxHello

Hello'を探すパターンをコンパイルしています。

Pattern pattern = Pattern.compile("Hello");
Matcher matcher = pattern.matcher("HelloxxxHelloxxxHello");

3つのマッチが見つかるはずです。何件マッチしたかを知るにはどうしたらよいですか?

いろいろなループを試しましたし、また matcher.groupCount() を使ったりしましたが、うまくいきませんでした。

どのように解決するのですか?

matcher.find() が見つかりません。 すべて のみがマッチし だけがマッチします。

Java 9+の解決策

long matches = matcher.results().count();

Java 8 以前のバージョンに対する解決策

以下のようにする必要があります。( Java 9 からは、よりすっきりした解決方法があります )

int count = 0;
while (matcher.find())
    count++;

ブツブツ matcher.groupCount() は全く別のものです。

完全な例 :

import java.util.regex.*;

class Test {
    public static void main(String[] args) {
        String hello = "HelloxxxHelloxxxHello";
        Pattern pattern = Pattern.compile("Hello");
        Matcher matcher = pattern.matcher(hello);

        int count = 0;
        while (matcher.find())
            count++;

        System.out.println(count);    // prints 3
    }
}

重複するマッチの処理

のマッチをカウントする場合 aaaaaa とすると、上記のスニペットでは 2 .

aaaa
aa
  aa

3件マッチするように、つまりこのような動作になります。

aaaa
aa
 aa
  aa

インデックスで一致するものを検索する必要があります。 <start of last match> + 1 を以下のように検索します。

String hello = "aaaa";
Pattern pattern = Pattern.compile("aa");
Matcher matcher = pattern.matcher(hello);

int count = 0;
int i = 0;
while (matcher.find(i)) {
    count++;
    i = matcher.start() + 1;
}

System.out.println(count);    // prints 3