Это может быть способ упростить ваше состояние, даже если не в одном регулярном выражении:
regexp_like(ID, '^[190]\d{3}-\d{6}-\d{3}-\d$') and
substr(ID, 1, 2) not in ('00', '15')
Здесь я использую ^[190]\d{3}
вместо ^\d{4}
, чтобы соответствовать, только если первая цифра не в 2-8;
единственный способ избежать строк, начинающихся с 15 или 00, 000, 0000, - проверить первые два символа с помощью substr
.
С вашими данными, это
select ID,
case
when regexp_like(ID, '^[190]\d{3}-\d{6}-\d{3}-\d$') and
substr(ID, 1, 2) not in ('00', '15') then ID
end as result
from test
дает:
ID RESULT
------------------ ------------------
0614-210297-103-6 0614-210297-103-6
0014-210297-103-6
0004-210297-103-6
0000-210297-103-6
00120792-2..
0614- 210297-103-6
0614210297-103-6
2614-210297-103-6