Вы можете использовать
'^(?:(?!\s+[^:\s]+:).)*|[^:\s]+:[^:\s]+'
Смысл в том, чтобы сохранить все квантификаторы жадными и убрать все захватывающие скобки.
Часть ^(?:(?!\s+[^:\s]+:).)*
будет соответствовать - с начала строки- любой символ, 0 или более вхождений, который не запускает последовательность следующих шаблонов: 1+ пробелов, 1+ символов, отличных от :
и пробелов, а затем :
.
Онлайн тест :
select regexp_matches(
'test text user:testuser,anotheruser hashtag:peach,phone,milk site:youtube.com,twitter.com flair:?bobby?',
'^(?:(?!\s+[^:\s]+:).)*|[^:\s]+:[^:\s]+',
'gi'
);
Результат: