Postgres regexp_matches между двумя шаблонами - PullRequest
0 голосов
/ 12 декабря 2018

Я пытаюсь разбить выражение, как в Postgres 9.4: «некоторый текст 123_good_345 и другой текст 123_some_invalid и 222_work ok_333 stop.»

с использованием шаблона: (\d+\_.*\_\d+\D)+? результат:

"123_good_345"
"123_some_invalid and 222_work ok_333"

Но мне нужно

"123_good_345"
"222_work ok_333"

примечание, игнорируя "123_some_invalid"

Пожалуйста, помогите!

1 Ответ

0 голосов
/ 12 декабря 2018

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

\d+_(?:(?!\d_).)*_\d+

См. Демоверсию regex .Или, если между \d+_ и _\d+ не должно быть цифр, используйте

\d+_\D+_\d+

См. это регулярное выражение demo .

Подробности

  • \d+ - 1 или более цифр - _ - подчеркивание
  • (?:(?!\d_).)* - любой символ, 0 или более повторений, как можно больше, что делаетне начинать цифру + _ последовательность символов
  • \D+ - любые 1+ символов кроме цифр
  • _ - подчеркивание
  • \d+ - 1+ цифры.

См. демонстрационную версию PostgreSQL :

SELECT unnest(regexp_matches('some text 123_good_345 and other text 123_some_invalid and 222_work ok_333 stop.', '\d+_(?:(?!\d_).)*_\d+', 'g'));

или

SELECT unnest(regexp_matches('some text 123_good_345 and other text 123_some_invalid and 222_work ok_333 stop.', '\d+_\D+_\d+', 'g'));

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...