如何在Postgres中存储正则表达式“文字”?

时间:2019-02-15 22:50:44

标签: regex postgresql

我想将正则表达式模式/选项“ literals”存储在Postgres数据库中,例如:

Input.GetKeyDown

我认为指出期望的格式和文本使用会有所帮助。另外,我正在使用的应用程序框架可以将这种文本强制转换为正确的/<pattern>/options 类型。

我浏览了data types,并提供了extensions,但没有看到任何具体内容。我想念一个吗?

如果没有专门的类型,是否存在合理方式来限制TEXT 包含正则表达式(不验证正则表达式,只是为了确保正向文本之间-斜线)。这行得通吗?

Regex

目前,我仅在应用程序代码中使用这些文字,这就是为什么TEXT到pattern TEXT CONSTRAINT is_regex (pattern LIKE '/%/%') 转换非常有用的原因。在某些时候,我可能会更擅长CTE,并将它们 back 转换为常规的TEXT(没有正斜杠或选项)以用于Postgres pattern matching functions

1 个答案:

答案 0 :(得分:1)

PostgreSQL(到目前为止)不提供这种类型,但是一般来说,您有一些选择来保持数据库的完整性(我只能假设您希望这样做,以避免担心从数据库读取的数据会使应用程序失败,因为它不是有效的正则表达式)。

您最好的选择(您已经弄清楚了)是使用CHECK约束,一种或另一种约束。如果您打算在多个地方使用此 pattern ,建议您使用domain types。这样,您不必在多个列中定义这些约束。具有讽刺意味的是,编写这样一个CHECK约束的最好方法是编写一个正则表达式模式以匹配您的正则表达式模式(因为存在多个略有不同的正则表达式实现)。显然它并不完美,但可能已经足够了。即

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

但是,如果您可以检查PostgreSQL的实现,则可以(ab)使用CHECK约束不仅在评估的表达式为false时失败,而且在表达式抛出(引发)一些错误。因此,您可以调用regexp函数以检测它是否实际上是有效的正则表达式。尽管仍然需要拆分模式和选项部分。

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

https://rextester.com/YFG18381