4

次の正規表現パターンがあります^(\d+)(;(\d+))*$。そして、その正規表現内のグループの数とそれぞれの値を取得したいと思います。

groupCountとgroupを使用してみましたが、次の結果が得られます。

Input: "1"
Groups: 3
"1", "1", null, null 
Input: "1;2"
Groups: 3
"1;2", "1", ";2", "2"
Input: "1;2;3"
Groups: 3
"1;2;3", "1", ";3", "3"
Input: "1;2;3;4"
Groups: 3
"1;2;3;4", "1", ";4", "4"

私は最初のもの"1"がgroupCountから1を取得することを期待していました。そして最後の場合"1;2;3;4"、、、私はgroupCountから7を取得することを期待していました。

私が期待していたものを返すMatcherのメソッドはありますか?

編集:上記の出力を生成したコードを追加しました

String input = "1";
Pattern pattern = Pattern.compile("^(\\d+)(;(\\d+))*$");
for (int i = 2; i < 6; ++i) {
    Matcher matcher = pattern.matcher(input);
    matcher.matches();
    System.out.println("Input: \"" + input + "\"\nGroups: " + matcher.groupCount());
    for (int group = 0; group <= matcher.groupCount(); ++group) {
        System.out.print("\"" + matcher.group(group) + "\", ");
    }
    System.out.println();
    input += ";" + i;
}
4

1 に答える 1

5

申し訳ありませんが、グループについてあなたの側に誤解があります。

正規表現を使用してグループの数を定義します。文字列に依存しません。そして、正規表現で3つのグループを定義します。

 ^(\\d+)(;(\\d+))*$
  1     2 3

グループには、開き角かっこで番号が付けられています。したがって、正規表現には常に正確に3つのグループがあります。それらが一致する場合、何かが完全に異なります。

したがって、最初のグループには常に最初に見つかった番号があります。他の2つのグループでは、何か特別なことをしています。キャプチャグループを繰り返しています。

一致する次の番号はすべてグループ3に格納されているため、最終結果には最後の番号のみが表示されます。.netではすべての一致を読み取ることができますが、Javaではそれができないと思います。

解決:

正規表現を使用して文字列を検証します

^\\d+(;\\d+)*$

そして、フォーマットに問題がない場合は、「;」を分割して数値を取得します。

于 2013-01-21T09:31:34.690 に答える