【发布时间】:2017-03-01 03:05:56
【问题描述】:
这是我尝试过的众多检查表达式之一:
(url::text ~* 'https?:\/\/(www\.)?[-a-zA-Z0-9@:%._\+~#=]{2,255}\.[a-z]{2,6}\b([-a-zA-Z0-9@:%_\+.~#?&//=]*)'::text)
这永远不会奏效。
但奇怪的是,这样做(用于电子邮件验证):
(email::text ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z]+$'::text)
我不确定这两个检查表达式之间的区别是什么,但我很想知道。
那么如何通过 Postgres 中的检查约束来验证 URL?
【问题讨论】:
-
你所说的“从不工作”是什么意思。正在发生什么,您希望发生什么?
-
一般来说,在验证这样的事情时,最好使用更基本的表达式。像'^https?://'这样的超级简单的东西。否则,将来当您不可避免地发现一个与您的正则表达式不完全匹配的 URL 时,现在您必须进行 schema 更改。如果您可以让您的业务逻辑甚至 UI 层进行此类验证,则最好。还值得注意的是批量插入速度会变慢。
-
@mroach 谢谢!这真的很有帮助。如果 url 不是正确的正则表达式,我期望约束拒绝插入/更新,如果 url 是正确的正则表达式,则接受插入/更新。
-
我很困惑。你说你想匹配一个 URL,但你给出了一个匹配电子邮件的模式。
-
退格 (
\b) 在 URL 验证模式中的作用是什么? word boundary in PostgreSQL 是\y(或\m和\M表示单词的开头和结尾)。此外,如果没有^和$,您的正则表达式只会验证输入包含 一个URL,而不是它本身就是一个URL。我还建议您使用比这更简单的模式。但也可以考虑支持IDNs。
标签: sql regex postgresql