Сканирование списка с помощью группировки регулярных выражений Java - PullRequest
0 голосов
/ 17 марта 2012

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

(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"

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

1 Ответ

1 голос
/ 17 марта 2012

Вместо того, чтобы сопоставлять всю строку одним вызовом 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
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...