Regexp_like 与在线正则表达式验证器对比 - 不同的结果

Regexp_like vs regex validators online - diferent results

我有一个使用 plsql 进行电子邮件验证的正则表达式,这让我有些头疼...:) 这是我用于电子邮件 (rercear12345@gmail.com) 验证的条件:

IF NOT REGEXP_LIKE (user_email, '^([\w\-\.]+)@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|(([\w\-]+\.)+)([a-zA-Z]{2,4}))$') THEN
            control := FALSE;
            dbms_output.put_line('EMAIL '||C.user_email||' not according to regex');
END IF;

如果我根据表达式创建 select,我也没有得到任何值:

Select * from TABLE_X where REGEXP_LIKE (user_email, '^([\w\-\.]+)@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|(([\w\-]+\.)+)([a-zA-Z]{2,4}))$');

使用 regex101.com 我得到了与此电子邮件的完全匹配:rercear12345@gmail.com

有什么想法吗?

Oracle 支持的正则表达式语法是in the documentation

看来 Oracle 不理解 [] 里面的 \w。您可以将其扩展为:

with table_x (user_email) as (
  select 'rercear12345@gmail.com' from dual
  union all
  select 'bad name@gmail.com' from dual
)
Select * from TABLE_X
where REGEXP_LIKE (user_email, '^[a-zA-Z_0-9.-]+@((\[([0-9]{1,3}\.){3}[0-9]{1,3}\])|([a-zA-Z_0-9-]+.)+[a-zA-Z]{2,4})$');

USER_EMAIL            
----------------------
rercear12345@gmail.com

您不需要在方括号内转义 .-,这样您就可以匹配文字反斜杠。

这种要求以前出现过 - 例如here - 但您似乎允许 IP 地址八位字节而不是 FQDN,用文字方括号括起来,这是不寻常的。

正如@BobJarvis 所说,您也可以使用 [:alnum:] 但仍需要包含下划线。这可能允许您不期望的非 ASCII 'letter' 字符;尽管它们可能有效,as are other symbols you exclude;不过,您似乎正在关注那篇文章中提到的 'common advice'。