Общее количество групп совпадений зависит не от целевой строки ("foo: a b c d"
, в вашем случае), а от шаблона. Ваш шаблон всегда будет иметь 3 группы:
^([^:]+):(:? ([^ ]+))++$
^ ^ ^
| | |
1 2 3
Группа 1 st будет удерживать ваш ключ, а группа 2 nd , которая соответствует группе 3, но затем содержит пробел, всегда будет содержать только 1 ваши ценности. Это либо первые значения (в случае неадекватности +?
), либо последнее значение (в случае жадного сопоставления).
То, что вы можете сделать, это просто сопоставить:
^([^:]+):\s*(.*)$
чтобы у вас были следующие совпадения:
- group(1) = "foo"
- group(2) = "a b c d"
, а затем разбить группу 2 nd на ее пробелы, чтобы получить все значения:
import java.util.Arrays;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class Main {
public static void main (String[] args) throws Exception {
Matcher m = Pattern.compile("^([^:]+):\\s*(.*)$").matcher("foo: a b c d");
if(m.find()) {
String key = m.group(1);
String[] values = m.group(2).split("\\s+");
System.out.printf("key=%s, values=%s", key, Arrays.toString(values));
}
}
}
который напечатает:
key=foo, values=[a, b, c, d]