Почему этот postgres regexp_match дает мне ноль вместо групп регулярных выражений? - PullRequest
0 голосов
/ 19 октября 2019

Это:

select regexp_matches('test text user:testuser,anotheruser hashtag:peach,phone,milk site:youtube.com,twitter.com flair:?bobby?', '^.*?(?=\s+[^:\s]+:)|([^:\s]+):([^:\s]+)','gi');

дает мне только одно совпадение группы и строку с NULL:

regexp_matches  
-----------------
 {NULL,NULL}
 {flair,?bobby?}

Это прекрасно работает, когда я проверяю это здесь:

https://regex101.com/r/AxsatL/3

Что я делаю не так?

1 Ответ

0 голосов
/ 20 октября 2019

Вы можете использовать

'^(?:(?!\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'
);

Результат:

enter image description here

...