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

Рейтинг: -1Ответов: 1Опубликовано: 30.06.2023

Как правильно составить регулярное выражения для Java?

На ввод идут такие данные "<color:#123456>Привет <color:#5A9ACE> мир".

А вывод должен быть

["<color:#123456>Привет ", "<color:#5A9ACE> мир"]

Вот что я смог собрать, но это не то "(\{color:#+([a-zA-Z1-9]{6})+})+(.+)"

Ответы

▲ 1Принят

Следует использовать такое выражение: (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> - ' мир'