Вы можете использовать
\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](https://i.stack.imgur.com/IQhQp.png)