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

の代わりにチルダ演算子の1つが必要だと思いますlike

likeワイルドカードのみで構成される異なる構文(たとえば、%の代わりに使用.*)があり、ワイルドカードは文字列全体と一致する必要があるため、のようなアンカーは。^$一緒に使用することはできませんlike。個人的には、実際のパターンマッチングというよりもファイルグロブのようなものだと思います。

チルダ演算子は、egrep、sed、およびawkに似た堅牢な正規表現構文を提供します。

于 2012-04-15T18:36:02.833 に答える