用于转换为 oracle pl/sql 的电子邮件的 salesforce 正则表达式

Posted

技术标签:

【中文标题】用于转换为 oracle pl/sql 的电子邮件的 salesforce 正则表达式【英文标题】:salesforce regex for emails converted to oracle pl/sql 【发布时间】:2016-05-25 20:35:40 【问题描述】:

我知道我不应该使用正则表达式来验证电子邮件地址,但我需要一些东西来确保与销售人员的夜间直接同步不会因无效的电子邮件地址而失败

根据这个salesforce knowledge article,他们使用以下正则表达式来验证他们的电子邮件地址

REGEX ( UPPER ( EmailField__c ) ,"^[A-Z0-9._%+-/!#$%&'*=?^_`|~]+@[A-Z0-9.-]+\\.[A-Z]2,4$")

但是,如果我尝试将此 reghex 转换为 oracle 使用,它很简单不起作用,regexp_like 永远不会返回(注意我必须将单引号加倍以转义字符串)

CREATE OR REPLACE FUNCTION valid_email_web (p_email in varchar2)
                                      return string is
  v_return  varchar2(255);
  email_regexp constant varchar2(1000) := '^[A-Z0-9._%+-/!#$%&''*=?^_`|~]+@[A-Z0-9.-]+\\.[A-Z]2,4$';

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

END;

我也尝试了 not regexp_like,但也没有用

任何帮助将不胜感激

【问题讨论】:

请添加一些失败的示例地址(当然要更改它们)并解释它们是如何失败的。 @Gary_W 每个电子邮件地址都失败,无论格式是否正确 【参考方案1】:

这在删除管道前面不需要的反斜杠(在字符类括号内时不需要)和域前面的点后起作用。由于使用了另一种引用方法(也称为 q-quote 机制),现在也只需要一个单引号。用您失败的地址进行测试会很有趣。

编辑:当使用不区分大小写的标志到 regexp_like 时,不需要传入地址周围的UPPER(),因此我更改了示例。

select 1 
from dual
where regexp_like( 'test@test.com', 
                   q'[^[A-Z0-9._%+-/!#$%&'*=?^_`\|~]+@[A-Z0-9.-]+\.[A-Z]2,4$]', 'i');

我不确定是否会将域限制为 4 个字符,除非您有特定要求:list of top level domains from ICANN

【讨论】:

我会在哪里删除 4 字符域? 2,4?感谢您的帮助,遗憾的是我对正则表达式的了解有限 最后一个\.[A-Z]2,4 表示将[A-Z] 集合中最后一个文字句点字符之后的字符限制为至少2 个但不超过4 个字符。

以上是关于用于转换为 oracle pl/sql 的电子邮件的 salesforce 正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

用于处理来自 CLOB 的 CSV 的 Oracle PL/SQL 包/过程

在 PL/SQL Oracle 中将 FOR 语句转换为 FORALL

将 Oracle PL/SQL 代码转换为 C#

将 SQL 查询转换为 PL/SQL 可以提高 Oracle 12c 中的性能吗? [关闭]

来自 Oracle pl/sql 的电子邮件中的特殊字符

Oracle常用函数