Регулярное выражение для сопоставления со списком

#java #regex

#java #регулярное выражение

Вопрос:

У меня есть следующий текст: some unknown random stuff here: (ben, tim, sam toben, suzei)

Мне нужно использовать регулярное выражение только для извлечения каждого из элементов из списка (неизвестного размера), разделенного запятыми: ben , tim , sam toben , suzei в соответствующие группы. Начальный / конечный пробел не имеет значения.

Я попробовал следующее: (?:(([^,] )) но он будет выводиться только ben как группа.

Есть идеи?

Комментарии:

1. Какой язык. Вероятно, вам потребуется использовать для этого нечто большее, чем простое регулярное выражение. Например, метод разделения или что-то в этом роде…

2. @Jan — Я забыл, что существуют языковые реализации, я отмечу — спасибо.

3. @MadPhysicist — Мне нужно использовать регулярное выражение только к сожалению, иначе я мог бы использовать разделение строк.

4. Регулярное выражение Java не может иметь динамического количества совпадающих групп в одном выражении. То, что вы просите, невозможно. Однако вы можете сделать это с find() помощью цикла. Это было бы нормально? Нравится это ?

5. Для конкретной проблемы, подобной этой, не существует такого понятия, как «только регулярное выражение». Здесь вы должны иметь в виду какую-то реализацию регулярных выражений.

Ответ №1:

Это не то, что вы можете сделать так, как хотите, только с регулярными выражениями. Однако это можно сделать с помощью регулярных выражений и String.split() .

Что-то вроде этого:

 String[] getList(String text) {
    Pattern p = Pattern.compile(". \((. )\)"); // Note the doubled backslashes
    Matcher m = p.matcher(text);
    if (m.find()) {
        return m.group(1).split(",");
    } else {
        return new String[0];
    }
}
  

Демонстрация регулярного выражения в Regex101

Что это делает, так это захватывает содержимое скобок, а затем разбивает это содержимое на массив по символу запятой.

Комментарии:

1. Вы разбиваете сопоставленный текст с помощью одинарной кавычки (‘), но вам нужно разделить его запятой (,). Если нет, оно вернет строку без разделения.