如何在 Postgres 中存储正则表达式"literals"?



我想在Postgres数据库中存储REGEX模式/选项"文字",例如:

/<pattern>/options

我认为指出文本的预期格式和使用很有帮助。另外,我正在使用的应用程序框架可以将这种文本胁到适当的Regex类型。

我浏览了数据类型并提供了扩展名,但没有看到任何具体的内容。我想念一个吗?

如果没有专门类型,是否有一种合理的方法来将文本限制为可能包含正则-slashes)。这有效吗?

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

目前,我仅在应用程序代码中使用这些文字,这就是为什么Regex转换文本非常有帮助的原因。在某个时候,我可能会在CTE上变得更好,然后将它们转换为postgres模式匹配函数中使用的常规文本(没有前向斜线或选项)。

PostgreSQL不提供此类类型(到目前为止),但总的来说,您有一些保留数据库完整性的选项(我只能假设您希望您避免担心数据您从数据库中读取您的应用程序,因为它不是有效的正则表达式)。

最好的选择是(您已经想出的)是使用一种或另一种方式使用CHECK约束。如果您打算在多个位置使用此模式,我建议您使用域类型。这样,您就不必在多个列定义这些约束。具有讽刺意味的是,编写这样的CHECK约束的最佳方法是编写REGEXP模式以匹配您的您的 Regexp模式(因为有多个RegexP实现,有一些差异)。显然它不会是完美的,但可能足够好。即。

create domain likely_regexp as text
    check (value ~ '^/([^/]*(\/[^/]*)*[^\])?/[a-z]*$');

但是,如果您可以对PostgreSQL的实现进行检查,则可以(AB)使用CHECK约束不仅在评估表达式为false时失败的事实,而且当表达式引发(提高)某些错误时它们也会失败。因此,您可以调用REGEXP函数,以检测它实际上是有效的正则表达式。Altough您仍然必须将模式和选项部分分开。

create domain pg_regexp as text
    check (regexp_replace('', replace(substring(value from '^/(.*)/'), '/', '/'),
                          '', substring(value from '/([^/]*)$')) = '');

https://rextester.com/yfg18381

最新更新