Регулярное выражение для postgreSql, которое соответствует всем двузначным числам кроме одного

Возможно ли средствами postgresql regexp составить выражение, которое соответствует всем двузначным числам кроме одного конкретного - например 37.

пожалуйста, не предлагайте варианты использовать ключевое слово NOT - задача состоит в том, чтобы составить именно такой regexp.


Ответы (1 шт):

Автор решения: Alexander Pavlov

Самое простое - разбить выражение на две части

  1. все числа, кроме начинающихся с 3 [12456789][0123456789]
  2. все числа, начинающиеся с 3, но не заканчивающиеся на 7 3[012345689]

Искать (1) или (2)

with recursive nums (n) as (
  -- сгенерируем тысячу
  values(0) union all select n+1 from nums where n < 999
)
-- все двузначные числа, кроме 37
select * from nums where n::text ~ '^([12456789][0123456789]|3[012345689])$'


Оказывается, Postgres поддерживает negative lookbehind

with recursive nums (n) as (
 values(0) union all select n+1 from nums where n < 999
)
select * from nums where n::text ~ '^\d\d(?<!37)$'

→ Ссылка