2016-04-28 68 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