Как получить массив из строки по шаблону с использованием регулярного выражения?
Как правильно составить регулярное выражения для Java?
На ввод идут такие данные "<color:#123456>Привет <color:#5A9ACE> мир".
А вывод должен быть
["<color:#123456>Привет ", "<color:#5A9ACE> мир"]
Вот что я смог собрать, но это не то "(\{color:#+([a-zA-Z1-9]{6})+})+(.+)"
Ответы (1 шт):
Автор решения: Nowhere Man
→ Ссылка
Следует использовать такое выражение: (color:#[\dA-F]{6})(.*?)(?=$|color:#[\dA-F]{6}) (Regex101 демо):
- Группа 1:
(color:#[\dA-F]{6})- префикс цвета с hex-значением - Группа 2:
(.*?)- всё, что идёт после префикса - Положительный просмотр вперёд (positive lookahead)
(?=$|color:#[\dA-F]{6})-- пока не найден конец входной строки или следующий префикс
Java код (добавлены угловые скобки в шаблон и входную строку):
public static String[] parse(String str) {
return Pattern.compile("(<color:#[\\dA-F]{6}>)(.*?)(?=$|<color:#[\\dA-F]{6}>)")
.matcher(str)
.results()
.map(mr -> mr.group(1) + " - '" + mr.group(2) + "'")
.toArray(String[]::new);
}
Можно просто использовать .map(MatchResult::group) для основного совпадения без дополнительного форматирования.
Тест:
String str = "<color:#123456>Привет! <color:#5A9ACE> мир";
Arrays.stream(parse(str)).forEach(System.out::println);
Результат:
<color:#123456> - 'Привет! '
<color:#5A9ACE> - ' мир'
