2012-03-16 2 views
0

Я хочу получить позиции и длины элементов в списке. Поэтому я хотел бы использовать группировку регулярных выражений, потому что с этим я могу получить смещения и длины совпадающих групп. Элементы разделяются запятыми и могут содержать любые символы. Вот пример:Список сканирования с группировкой регулярных выражений 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" 

Если я использую тот же регулярное выражение в три раза, а не с помощью оператора звезды он работает. Я думаю, что я делаю что-то неправильно с повторением через группы. Есть идеи?

+0

Я не знаю Java регулярное выражение очень хорошо, но: есть ли какой-либо причине вы собираетесь я от 1 до менее чем равный groupCount(), а не от 0 до менее чем groupCount ()? – mfrankli

+0

@mfrankli: Группы основаны на 1, а не на 0. (Это стандартно для почти всех механизмов регулярных выражений.) В Java группа 0 представляет собой псевдогруппу, которая соответствует всей подстроке. – ruakh

ответ

1

Вместо того, чтобы сопоставлять всю строку с одним вызовом find, я думаю, вам следует создать регулярное выражение, соответствующее каждому элементу списка, а затем выполнить цикл по этим совпадениям. Например:

// regex for any sequence of non-comma, non-parenthesis characters that 
// neither starts nor ends with whitespace: 
Pattern p = Pattern.compile("[^,\\s()](?:[^,()]*[^,\\s()])?"); 
Matcher m = p.matcher(textToMatch); 
while (m.find()) { 
    System.out.println(m.group()); // print entire matched substring 
} 
Смежные вопросы