3

アスタリスクが付いたグループのコンテンツを取得するにはどうすればよいですか?

たとえば、カンマ区切りのリストを切り取りたいと思います1,2,3,4,5

private static final String LIST_REGEX = "^(\\d+)(,\\d+)*$";
private static final Pattern LIST_PATTERN = Pattern.compile(LIST_REGEX);

public static void main(String[] args) {
    final String list = "1,2,3,4,5";
    final Matcher matcher = LIST_PATTERN.matcher(list);
    System.out.println(matcher.matches());
    for (int i = 0, n = matcher.groupCount(); i < n; i++) {
        System.out.println(i + "\t" + matcher.group(i));
    }
}

そして、出力は

true
0   1,2,3,4,5
1   1

1, 2, 3, ...など、すべてのエントリを取得するにはどうすればよいですか?

私は共通の解決策を探しています。これは単なる例です。次のようなリストに一致する
ような、より複雑な正規表現を想像してください^\\[(\\d+)(,\\d+)*\\]$[1,2,3,4,5]

4

2 に答える 2

5

使用できますString.split()

for (String segment : "1,2,3,4,5".split(","))
    System.out.println(segment);

または、アサーションで繰り返しキャプチャできます。

Pattern pattern = Pattern.compile("(\\d),?");
for (Matcher m = pattern.matcher("1,2,3,4,5");; m.find())
     m.group(1);

追加した 2 番目の例では、同様の一致を行うことができます。

for (String segment : "!!!!![1,2,3,4,5] //"
                          .replaceFirst("^\\D*(\\d(?:,\\d+)*)\\D*$", "$1")
                          .split(","))
    System.out.println(segment);

オンライン コード デモを作成しました。これがあなたの望むものであることを願っています。


アスタリスクを持つ任意のグループのすべての一致 (0、1、または複数) を取得するにはどうすればよい(xyz)*ですか? [グループが繰り返され、すべての繰り返しのキャプチャを取得したい。]

いいえ、あなたがすることはできません。Regex Capture Groups and Back-Referencesは、その理由を示しています。

特定のグループの戻り値は、最後にキャプチャされたものです

量指定子を持つキャプチャ グループはその番号を保持するため、グループを調べたときにエンジンはどのような値を返しますか? すべてのエンジンは、キャプチャされた最後の値を返します。たとえば、文字列A_B_C_D_を と一致させる場合([A-Z]_)+、一致を検査すると、グループ 1 は になりますD_。.NET エンジンを除いて、中間値はすべて失われます。基本的に、グループ 1 はパターンが一致するたびに上書きされます。

于 2014-09-15T23:21:12.423 に答える
2

次のようなものを探していると思いますが、これは両方の例を処理します。

private static final String LIST_REGEX = "^\\[?(\\d+(?:,\\d+)*)\\]?$";
private static final Pattern LIST_PATTERN = Pattern.compile(LIST_REGEX);

public static void main(String[] args) {
    final String list = "[1,2,3,4,5]";
    final Matcher matcher = LIST_PATTERN.matcher(list);

    matcher.find(); 
    int i = 0;

    String[] vals = matcher.group(1).split(",");

    System.out.println(matcher.matches());
    System.out.println(i + "\t" + matcher.group(1));

    for (String x : vals) {
       i++;
       System.out.println(i + "\t" + x);
    }
}

出力

true
0   1,2,3,4,5
1   1
2   2
3   3
4   4
5   5
于 2014-09-15T23:24:07.080 に答える