2016-04-28 31 views
0

我有一個返回的電子郵件地址是否有效的Oracle函數或不甲骨文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失敗?

,而不是重新調整隻是空,如果不好,也許對原因

我想電子郵件mgptva一個新的變量; [email protected]返回:

v_return_msg =「無效字符‘;’ 7位

我不包括我對這個嘗試很抱歉,我不知道從哪裏開始,谷歌搜索處理不當是富有成果的

+0

這是非常雄心勃勃的,因爲它是;例如,標準允許在電子郵件地址的本地部分使用@,如果使用\轉義該地址,則允許該域成爲方括號中的四部分IP地址。例如,Foo \ @ Bar @ [192.232.96.4]是電子郵件地址的合法格式。你的正則表達式不允許。所以回到你的問題:你想檢查本書中的每一條規則,或者只是指出最明顯的違規行爲(沒有@或沒有域或多個未轉義@或整個電子郵件字符串太長)?後者也許有一定意義。 – mathguy

+0

是啊,我們只是最明顯的違規行爲...「喬\\吹」@ example.com是一個實際合法形成的電子郵件地址,但不通過正則表達式...只是試圖過濾明顯,以防止數據輸入錯誤 –

+0

你最好的選擇imho將是一個簡單的解析器。我懷疑這可以通過一個正則表達式引擎來處理,至少有合理的努力 - 當然,甲骨文公司並沒有達到這個標準。 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