Я хочу получить позиции и длины элементов в списке. Поэтому я хотел бы использовать группировку регулярных выражений, потому что с этим я могу получить смещения и длины совпадающих групп. Элементы разделяются запятыми и могут содержать любые символы. Вот пример:Список сканирования с группировкой регулярных выражений Java
(1234, A {}, "Foo")
Вот что я пытался сделать:
String textToMatch = "(1234, A{}, \"foo\")";
Pattern p = Pattern.compile("\\(\\s*([^,]+?)(?:\\s*,\\s*([^,]+?)\\s*)*\\)");
Matcher m = p.matcher(textToMatch);
if (m.find()) {
for (int i = 1; i <= m.groupCount(); i++) {
System.out.println(m.group(i));
}
}
К сожалению, это не работает. Я получаю только первый и последний элемент, но не промежуточные. Вот результат я получаю с кодом показан выше:
1234
"foo"
Если я использую тот же регулярное выражение в три раза, а не с помощью оператора звезды он работает. Я думаю, что я делаю что-то неправильно с повторением через группы. Есть идеи?
Я не знаю Java регулярное выражение очень хорошо, но: есть ли какой-либо причине вы собираетесь я от 1 до менее чем равный groupCount(), а не от 0 до менее чем groupCount ()? – mfrankli
@mfrankli: Группы основаны на 1, а не на 0. (Это стандартно для почти всех механизмов регулярных выражений.) В Java группа 0 представляет собой псевдогруппу, которая соответствует всей подстроке. – ruakh