9
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 - 被拒绝

一切都被拒绝。

我究竟做错了什么?

4

3 回答 3

30

您不要在 PostgreSQL 中将 LIKE 与正则表达式一起使用,而是使用~~*!~!~*运算符:

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

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

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

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

所以你的测试应该看起来更像这样:

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

您可能还想为电子邮件地址寻找更好的正则表达式,“a+b@c.com”是一个有效的电子邮件地址,但您的正则表达式不喜欢它。

于 2012-04-15T18:36:33.457 回答
6

验证电子邮件地址充满了危险。创建一个拒绝接受有效电子邮件地址的正则表达式比创建一个只拒绝无效电子邮件地址的正则表达式要容易得多。这是符合 RFC822 的perl 正则表达式

我的建议是接受任何东西,然后使用电子邮件验证它是否有效。如果您必须进行验证,请使用该页面上列出的 perl 模块和 pl/perl。

于 2012-04-15T20:27:59.013 回答
1

我认为您想要一个波浪号运算符而不是like.

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

波浪号运算符为您提供更类似于 egrep、sed 和 awk 的健壮的正则表达式语法。

于 2012-04-15T18:36:02.833 回答