如何创建约束以在postgres中使用正则表达式?
答案 0 :(得分:46)
CREATE TABLE emails (
email varchar
CONSTRAINT proper_email CHECK (email ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z]+$')
);
(正则表达式可能不完整,您可以搜索正则表达式,以便在整个网络上进行电子邮件匹配,并选择您最喜欢的那个。)
答案 1 :(得分:19)
我建议使用现有的电子邮件地址解析模块,而不是编写自己的模式匹配。例如:
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))
);
答案 2 :(得分:3)
您还可以创建domain并在定义表格列时将其用作类型,例如
CREATE DOMAIN email AS TEXT CHECK (VALUE ~* '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z]+$');
CREATE TABLE emails (
email email
);
这样,每次在数据库中使用包含列的电子邮件时,您都不需要重新定义正则表达式。
答案 3 :(得分:0)
更好的模式,取自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])+)\])
尽管我注意到没有锚(^ $)。