PostgreSQL 正则表达式验证电子邮件地址

10
CREATE OR REPLACE FUNCTION addUploader(INTEGER, TEXT, TEXT) RETURNS TEXT AS $$

DECLARE

  u_id ALIAS FOR $1 ;
  username ALIAS FOR $2;
  email ALIAS FOR $3; 

BEGIN 

  IF email NOT LIKE '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z]+$' THEN

    RAISE EXCEPTION 'Wrong E-mail format %', email
        USING HINT = 'Please check your E-mail format.';

  END IF ; 

  INSERT INTO uploader VALUES(u_id,username,email);

  IF NOT FOUND THEN
    RETURN 'Error';
  END IF;
  RETURN 'Successfully added' ; 

EXCEPTION WHEN unique_violation THEN
  RAISE NOTICE 'This ID already exists. Specify another one.' ; 
  RETURN 'Error' ; 

END ; $$ LANGUAGE 'plpgsql' ; 

SELECT addUploader(25,'test','steven@gmail.com');

这个正则表达式不能匹配正确的电子邮件地址。它应该可以匹配steven@gmail.com。它还拒绝了任何其他字符串。

stevengmailcom - 被拒绝

所有内容都被拒绝。

我做错了什么?


可能是Postgres验证电子邮件地址的函数的重复。 - Evan Carroll
3个回答

35

在PostgreSQL中,不应该使用LIKE与正则表达式配合使用,而是应该使用以下操作符:~~*!~!~*

~
区分大小写匹配正则表达式

~*
不区分大小写匹配正则表达式

!~
区分大小写不匹配正则表达式

!~*
不区分大小写不匹配正则表达式

因此,你的测试应该像下面这样:

IF email !~ '^[A-Za-z0-9._%-]+@[A-Za-z0-9.-]+[.][A-Za-z]+$' THEN

你可能也想寻找一个更好的用于匹配邮件地址的正则表达式,因为"a+b@c.com"是一个有效的邮件地址,但是你当前使用的正则表达式无法匹配它。


为什么你不用LIKE与正则表达式,而是使用~?你能解释一下吗? - Programer Beginner
@ProgramerBeginner 因为 LIKE 操作符 仅支持简单的模式匹配,而 ~ 操作符 则支持正则表达式。 - mu is too short

6
验证电子邮件地址是非常困难的。创建一个拒绝有效电子邮件地址的正则表达式要比创建一个只拒绝无效地址的正则表达式容易得多。这里有一个符合RFC822标准的perl正则表达式

我的建议是接受任何格式的电子邮件地址,然后使用电子邮件验证其是否有效。如果您一定要进行验证,请使用该页面上列出的perl模块和pl/perl。


1

我认为你需要使用波浪线运算符之一,而不是like

like有一个不同的语法(例如它使用%而不是.*)仅由通配符组成,并且它们必须匹配整个字符串,因此像^$这样的锚不能与like一起使用。我个人认为它更像文件通配符而不是实际的模式匹配。

波浪线运算符提供了一个强大的正则表达式语法,更类似于egrep、sed和awk。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接