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'。
我有一个使用 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'。