PostgreSQL не предлагает такого типа (на данный момент), но, вообще говоря, у вас есть несколько вариантов для сохранения целостности базы данных (я могу только предположить, что вы хотите этого, чтобы не беспокоиться о том, что данные, которые вы читаете из базы данных, не сработают в вашем приложениипотому что это недопустимое регулярное выражение).
Лучшая ставка (которую вы уже выяснили) - это использовать ограничение CHECK
, так или иначе.Если вы планируете использовать этот шаблон в нескольких местах, я предлагаю вам использовать типы доменов .Таким образом, вам не нужно определять эти ограничения в нескольких столбцах.По иронии судьбы, лучший способ написать такое ограничение CHECK
- написать шаблон регулярного выражения, соответствующий вашим шаблонам регулярного выражения (поскольку существует несколько реализаций регулярного выражения с небольшими отличиями).Это, очевидно, не будет идеальным, но это может быть достаточно хорошо.Т.е.
create domain likely_regexp as text
check (value ~ '^/([^/]*(\\/[^/]*)*[^\\])?/[a-z]*$');
Но если у вас все в порядке, чтобы проверить реализацию PostgreSQL, вы можете (ab) использовать тот факт, что ограничения CHECK
терпят неудачу не только тогда, когда вычисляемое выражение равно false
, но они такжетерпит неудачу, когда выражение бросает (поднимает) некоторую ошибку.Таким образом, вы можете вызвать функцию регулярного выражения, чтобы определить, является ли она действительным регулярным выражением или нет.Хотя вам еще нужно разделить шаблон и часть опций.
create domain pg_regexp as text
check (regexp_replace('', replace(substring(value from '^/(.*)/'), '\/', '/'),
'', substring(value from '/([^/]*)$')) = '');
https://rextester.com/YFG18381