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