匹配未以分号分隔的电子邮件地址

时间:2014-05-30 11:19:21

标签: regex oracle email regex-negation

我需要匹配使用oracle sql" REGEXP_LIKE"在一些文本中所有多个电子邮件由空格分隔而不是分号。 我成功使用了以下正则表达式

\@.*(\ )+.*\@.*

这足以满足我的需求,直到一个聪明的家伙开始以这种格式推出多个电子邮件

 email@domain ; email@domain 

我之前的正则表达式失败了。 我想要的是匹配

 email@domain  email@domain 

(电子邮件由多个空格隔开)
但丢弃了:

 email@domain ; email@domain 

(电子邮件由空格分隔,但以分号分隔)

有没有一种简单的方法来实现这一目标?

提前致谢!

2 个答案:

答案 0 :(得分:1)

从原始表达式中的.*开始,我发现您对于指定电子邮件地址中的字符是否有效并不太感兴趣。所以我建议这样的事情:

^([^[:space:]@;]+@[^[:space:]@;]+(\s*))+$

样本使用

SELECT * FROM mytable WHERE REGEXP_LIKE(mycolumn, '^([^[:space:]@;]+@[^[:space:]@;]+(\s*))+$', 'c');

正则表达式解释

^([^[:space:]@;]+@[^[:space:]@;]+(\s*))+$
  • 在字符串^
  • 的开头处断言位置
  • 匹配下面的正则表达式并将其匹配捕获到反向引用号1 ([^[:space:]@;]+@[^[:space:]@;]+(\s*))+
    • 在一次和无限次之间,尽可能多次,根据需要回馈(贪婪)+
    • 匹配下面列表中不存在的任何单个字符,而不是换行符(换行符)[^[:space:]@;]+
      • 在一次和无限次之间,尽可能多次,根据需要回馈(贪婪)+
      • POSIX字符类“space”中的字符(任何Unicode分隔符,制表符,换行符,回车符,垂直制表符,换页符,下一行)[:space:]
      • 列表中的单个字符“@;”@;
    • 将字符“@”字面匹配@
    • 匹配下面列表中不存在的任何单个字符,而不是换行符(换行符)[^[:space:]@;]+
      • 在一次和无限次之间,尽可能多次,根据需要回馈(贪婪)+
      • POSIX字符类“space”中的字符(任何Unicode分隔符,制表符,换行符,回车符,垂直制表符,换页符,下一行)[:space:]
      • 列表中的单个字符“@;”@;
    • 匹配下面的正则表达式并将其匹配捕获到反向引用号2 (\s*)
      • 匹配单个字符“空格字符”(任何Unicode分隔符,制表符,换行符,回车符,垂直制表符,换页符,下一行)\s*
        • 在零和无限次之间,尽可能多次,根据需要回馈(贪婪)*
  • 断言字符串$
  • 最后的位置

答案 1 :(得分:0)

我猜你可以替换&#34 ;;"在文本中有空白量,然后使用您已有的方法分离电子邮件。如果您不使用";"文本中的任何其他位置。 (你不想替换那些!)你使用什么编程语言?在使用"某些文字"?时,你是指字符串吗?