Как написать регулярное выражение, которое захватывает неограниченное количество групп?

У меня есть строка из нескольких слов, например str1, str2, str3, ... strN. Количество слов может быть любым и неизвестно на момент написания регулярного выражения.

Можно ли написать регулярное выражение, которое будет соответствовать всей строке и группам захвата, по одному слову на группу? То есть будут захвачены следующие группы:

Группа 1: str1
...
Группа N: strN

Причина. Эта строка является частью большей строки. Другие элементы большой строки могут быть захвачены с помощью регулярного выражения. Я могу анализировать большую строку с помощью регулярного выражения и захватывать строку с несколькими словами в одну группу. Затем я могу разделить эту группу на другие str(s). Я думаю, что решение с одним с регулярным выражением для всей большой строки без разделения будет более элегантным, если оно существует.


person Andrei Botalov    schedule 07.01.2012    source источник
comment
А почему регулярное выражение? Форма split здесь звучит более уместно.   -  person Mat    schedule 07.01.2012
comment
Java, но если для Java нет решения, пожалуйста, предоставьте его для другого языка.   -  person Andrei Botalov    schedule 07.01.2012
comment
Как сказал @Mat, необходимо использовать split, см. Ниже.   -  person fge    schedule 07.01.2012


Ответы (2)


При условии, что ваша строка ввода называется input:

final String[] groups = input.split("\\s*,\\s*");

Массив groups будет содержать все совпадения.

person fge    schedule 07.01.2012
comment
Спасибо, но я искал решение для регулярных выражений, см. Обновленную причину, о которой идет речь. В любом случае, разделенное решение кажется более элегантным, чем регулярное выражение, даже если оно существует. - person Andrei Botalov; 07.01.2012
comment
Использование только одного регулярного выражения для этого - плохая идея, оно быстро становится нечитаемым. Тем более, что вы говорите, что можете захватить x, y, z, t ... в группе: просто извлеките эту группу и разделите ее. - person fge; 07.01.2012

Вы можете сделать что-то очень похожее: написать регулярное выражение только с одной группой, а затем проверить все совпадения этой группы. В java это будет выглядеть так:

    Pattern p = Pattern.compile("\\b(\\w+)\\b(?:,\\s)*");
    Matcher m = p.matcher("str1, str2, str3, ... strN");
    while(m.find()){
        System.out.println(m.group(1));
    }

Результат:

str1
str2
str3
...
strN

Чистое регулярное выражение - это \b(\w+)\b(?:,\s)*, где (?: - это группа без захвата (не считается группой).

person ynka    schedule 07.01.2012