如何创建约束来检查电子邮件在 postgres 中是否有效?

发布于 2024-11-01 10:18:04 字数 34 浏览 1 评论 0原文

如何创建约束以在 postgres 中使用正则表达式?

How can I create a constraint to use a regular expression in postgres?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

暖阳 2024-11-08 10:18:04
CREATE TABLE emails (
    email varchar
    CONSTRAINT proper_email CHECK (email ~* '^[A-Za-z0-9._+%-]+@[A-Za-z0-9.-]+[.][A-Za-z]+

(正则表达式可能不完整,您可以在网上搜索电子邮件匹配的正则表达式并选择您最喜欢的)。

) );

(正则表达式可能不完整,您可以在网上搜索电子邮件匹配的正则表达式并选择您最喜欢的)。

CREATE TABLE emails (
    email varchar
    CONSTRAINT proper_email CHECK (email ~* '^[A-Za-z0-9._+%-]+@[A-Za-z0-9.-]+[.][A-Za-z]+

(regex may be incomplete, you can search for regexp for email matching all over the web and pick the one you like best).

) );

(regex may be incomplete, you can search for regexp for email matching all over the web and pick the one you like best).

一紙繁鸢 2024-11-08 10:18:04

我建议使用现有的电子邮件地址解析模块,而不是构建自己的模式匹配。例如:

CREATE OR REPLACE FUNCTION check_email(email text) RETURNS bool
LANGUAGE plperlu
AS $
use Email::Address;

my @addresses = Email::Address->parse($_[0]);
return scalar(@addresses) > 0 ? 1 : 0;
$;

CREATE TABLE emails (
    email varchar
    CONSTRAINT proper_email CHECK (check_email(email))
);

I recommend using an existing email address parsing module instead of making up your own pattern matching. For example:

CREATE OR REPLACE FUNCTION check_email(email text) RETURNS bool
LANGUAGE plperlu
AS $
use Email::Address;

my @addresses = Email::Address->parse($_[0]);
return scalar(@addresses) > 0 ? 1 : 0;
$;

CREATE TABLE emails (
    email varchar
    CONSTRAINT proper_email CHECK (check_email(email))
);
墨落画卷 2024-11-08 10:18:04

您还可以创建一个 domain 并将其用作类型定义表列,例如,

CREATE DOMAIN email AS TEXT CHECK (VALUE ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z]+

这样您就不需要每次在数据库中使用包含列的电子邮件时重新定义正则表达式。

); CREATE TABLE emails ( email email );

这样您就不需要每次在数据库中使用包含列的电子邮件时重新定义正则表达式。

You can also create a domain and use it as a type when defining table columns, e.g.

CREATE DOMAIN email AS TEXT CHECK (VALUE ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z]+

This way you will not need to redefine the regex every time an email containing columns is used in the database.

); CREATE TABLE emails ( email email );

This way you will not need to redefine the regex every time an email containing columns is used in the database.

简美 2024-11-08 10:18:04

更好的模式,取自 OWASP regexp 验证库:
https://owasp.org/www-community/OWASP_Validation_Regex_Repository 是:

/^[a-zA-Z0-9_+&-]+(?:.[a-zA-Z0-9_+&-]+)*@(?: [a-zA-Z0-9-]+.)+[a-zA-Z]{2,7}$/

但这是相当有限的。它不支持评论或引用的名称,也不支持向有效的 IP 地址(例如 name@[10.99.22.4])发送电子邮件。 UUCP 电子邮件地址和许多其他地址也有效。

https://emailregex.com/ 建议使用以下正则表达式:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

虽然我注意到没有锚点 (^$)这。

A better pattern, taken from the OWASP regexp validation library at
https://owasp.org/www-community/OWASP_Validation_Regex_Repository is :

/^[a-zA-Z0-9_+&-]+(?:.[a-zA-Z0-9_+&-]+)*@(?:[a-zA-Z0-9-]+.)+[a-zA-Z]{2,7}$/

But this is quite limiting. It does not support comments or quoted names, nor does it support email to an IP address such as name@[10.99.22.4] which is valid. Also valid are UUCP email addresses and a host of others.

https://emailregex.com/ Suggest the following regexp:

(?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*|"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x01-\x09\x0b\x0c\x0e-\x7f])+)\])

Though I notice there are no anchors (^$) for this.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文