2016-04-28 8 views
0

私はオラクルの電子メールアドレスが有効であるかどうかを返す関数または電子メールが正規表現に合格した場合ではないオラクルRegex_like機能は:それ以外の場合は、戻り結果が、それは電子メールを返し、

CREATE OR REPLACE FUNCTION valid_email (p_email in varchar2) 
             return string is 
    v_return varchar2(255); 
    cemailregexp constant varchar2(1000) := '^[a-z0-9!#$%&''*+/=?^_`{|}~-]+(\.[a-z0-9!#$%&''*+/=?^_`{|}~-]+)*@([a-z0-9]([a-z0-9-]*[a-z0-9])?\.)+([A-Z]{2}|arpa|biz|com|info|intww|name|net|org|pro|aero|asia|cat|coop|edu|gov|jobs|mil|mobi|museum|pro|tel|travel|post)$'; 

BEGIN 
    if regexp_like(p_email,cemailregexp,'i') then 
    v_return := p_email; 
    else 
    v_return := null; 
    end if; 
    return v_return; 

END; 

を持っていなかったものを返しますNULL

私が知りたいのは、入力文字列のどの部分が失敗したのか、なぜregex_likeが失敗したのかです。 [email protected]は返すために、代わりに悪い場合は、単にnullを再調整のため、多分理由

のための新たな変数iが電子メールmgptvaを希望

v_return_msg =「無効な文字 ';' 7位

で、私はこれに向けて、私の試みを含んでいないため申し訳ありません、私はあなたがそれは非常にすべてのものです。でもhasntは

+0

これはかなり野心的です。例えば、標準では、\でエスケープされている場合は電子メールアドレスのローカル部分に@を使用でき、ドメインは四角で囲まれたIPアドレスになります。たとえば、Foo \ @ Bar @ [192.232.96.4]は電子メールアドレスの正式な形式です。あなたの正規表現ではどちらも許可されません。あなたの質問に戻る:あなたは本のすべてのルールをチェックしたいのですか、最も明白な違反を指摘したいのですか?(ドメインがない@またはドメインが1つもないか、エスケープされていない@後者は多分意味をなさないでしょう。 – mathguy

+0

私たちはちょうど最も明白な違反... "Joe \\ Blow" @ example.comは実際に合法的に形成された電子メールアドレスですが、正規表現を渡しません...ちょうどデータ入力ミスを防ぐために明らかにフィルタリングしようとしています –

+0

あなたの最善の賭けは簡単なパーサーになるでしょう。私はこれが正規表現エンジンによって処理されることは疑いの余地があります。少なくとも、合理的な努力を払ってください。確かに、オラクルはこれに準拠していません。 Perlの正規表現の実装が可能かもしれません。 – collapsar

答えて

1

正規表現一致または一致しないのいずれか実りされて検索グーグル、どこから始めれば知りません

電子メールアドレスは複雑であり、正規表現で検証するのは非常に難しいです。あなたのコアビジネスが電子メールアドレスバリデーターを作成しない場合、私はもうここで時間を無駄にしないでください。

私はこの記事に非常に同意しますStop Validating Email Addresses With Regexと私の正規の電子メールの検証は、次のとおりです。

create or replace function is_valid_email(p_email in varchar2) return number is 
begin 
    return regexp_count(p_email, '^\[email protected]\S+\.\S+$'); 
end; 

あなたは芸術の実装の一つの状態は、PerlのEmail::Validモジュールをチェック確認したい場合。

+0

便利なリンク:http://www.regular-expressions.info/email.html – user272735