Как хранить регулярные выражения "литералы" в Postgres? - PullRequest
0 голосов
/ 16 февраля 2019

Я хочу сохранить шаблон регулярных выражений / параметр "literals" в базе данных Postgres, например:

/<pattern>/options

Я думаю, что полезно указать ожидаемый формат и использование текста.Кроме того, используемая инфраструктура приложения может привести этот тип текста к правильному типу Regex.

Я просмотрел типы данных и предоставил расширения и не видел ничего конкретного.Я пропускаю один?

Если не существует специализированного типа, существует ли разумный способ ограничить TEXT вероятным содержанием регулярного выражения (не проверять регулярное выражение,просто для обеспечения текста между косыми чертами).Это работает?

pattern TEXT CONSTRAINT is_regex (pattern LIKE '/%/%')

В данный момент я использую только эти литералы в коде приложения, поэтому преобразование TEXT в Regex очень полезно.В какой-то момент я мог бы стать лучше в CTE и преобразовать их назад в обычный текст (без косой черты или опций) для использования в Postgres функциях сопоставления с образцом .

1 Ответ

0 голосов
/ 16 февраля 2019

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

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