質問: ### 前提・実現したいこと 正規表現からグループの数を取得したいです。 以下、イメージになります 1正規表現「(.+)_(\d{4,8})」の場合 (.+)グループ、(\d{4,8})グループ の【計2グループ】 2正規表現「(.+)_(\d{4,8})_(\S\(\S\))」の場合 (.+)グループ、(\d{4,8})グループ、(\S\(\S\))グループ の【計3グループ】 3正規表現「\(abc\)」の場合 文字列「(abc)」のため【グループなし】 ### 発生している問題・エラーメッセージ 正規表現 \(.+?\) で該当した個数=グループ数にしようとしましたが、 エスケープをされた括弧 \( \) の考慮の仕方がわかりません。 \(.+?\) をグループの定義とすると 2のイメージでは、(\S\(\S\))グループ が (\S\(\S\)グループ 3のイメージでは、(abc\)グループ扱い になってしまいます。 ### 質問事項 * 「正規表現の正規表現」を使わなくとも、正規表現のグループ数を取得する方法はないでしょうか(PatternクラスやMatcherクラスを調べてみましたがいまいち見つけられませんでした......) * 「正規表現の正規表現」を使う場合、どのような正規表現にすればいいでしょうか 不足情報などありましたら、そちらもご指摘願います。 何卒、よろしくお願いいたします。
回答: MatcherクラスのgroupCountメソッドで出来ませんか? ### 実験コード ``` import java.util.regex.Pattern; import java.util.stream.Stream; public class Q84924 { public static void main(String[] args) { Stream.of("(.+)_(\\d{4,8})", "(.+)_(\\d{4,8})_(\\S\\(\\S\\))", "\\(abc\\)") .map(Pattern::compile) .map(x -> x.matcher("")) // Matcherを作成することが目的なので、渡す文字列はnullでなければ何でもいい .map(x -> x.pattern() + " : " + x.groupCount() + "グループ") .forEach(System.out::println); } } ``` ### 結果 (.+)_(\d{4,8}) : 2グループ (.+)_(\d{4,8})_(\S\(\S\)) : 3グループ \(abc\) : 0グループ