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