sql - 使用 Oracle Regexp 从字段中提取电子邮件

标签 sql regex oracle

我想在字段中获取电子邮件格式的文本。我在下面尝试了sql,但没有运气。见 SqlFiddle .从正则表达式中删除 ^ 和 $ 也不起作用。

WITH TEST_DATA AS (
  SELECT 'foo@gmail.com' AS EMAIL FROM DUAL UNION ALL 
  SELECT 'mail foo@gmail.com' FROM DUAL UNION ALL           
  SELECT 'mail foo@gmail.com sent' FROM DUAL UNION ALL                
  SELECT 'foo@gmail.com sent count 23' FROM DUAL UNION ALL          
  SELECT 'mail already sent to foo@gmail.com and foo@hotmail.com' FROM DUAL UNION ALL                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                   
  SELECT 'foo@gmail.com sent count 23' FROM DUAL             
)SELECT REGEXP_SUBSTR(EMAIL,'^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,4}$') MAIL
 FROM TEST_DATA;

此数据集的预期输出

foo@gmail.com 
foo@gmail.com 
foo@gmail.com 
foo@gmail.com 
foo@gmail.com, foo@hotmail.com 
foo@gmail.com

任何帮助表示赞赏。

最佳答案

如果要在单个列中提取多个邮件ID,可以使用REGEXP_REPLACE函数。

假设您数据中的所有 id 都是有效的,

REGEXP_REPLACE (EMAIL, '(\w+@\w+\.\w+ ?)|(.)', '\1')

这将删除所有其他文本,除了至少由空格分隔的邮件 ID。

然后您可以删除任何尾随空格并添加逗号以分隔多个 ID。

REPLACE (TRIM (REGEXP_REPLACE (EMAIL, '(\w+@\w+\.\w+ ?)|(.)', '\1')),
            ' ',
            ', ')

例子:

WITH TEST_DATA
     AS (SELECT 'foo@gmail.com' AS EMAIL FROM DUAL
         UNION ALL
         SELECT 'mail foo@gmail.com' FROM DUAL
         UNION ALL
         SELECT 'mail foo@gmail.com sent to 123@zxc.com and qwe@rt.com' FROM DUAL
         UNION ALL
         SELECT 'foo@gmail.com sent count 23 and asd@qwert.edu' FROM DUAL
         UNION ALL
         SELECT 'mail already sent to foo@gmail.com and foo@hotmail.com' FROM DUAL
         UNION ALL
         SELECT 'foo@gmail.com sent count 23' FROM DUAL)
SELECT REPLACE (TRIM (REGEXP_REPLACE (EMAIL, '(\w+@\w+\.\w+ ?)|(.)', '\1')),
                ' ',
                ', ')
          MAIL
  FROM TEST_DATA;

MAIL
-----------------------------
foo@gmail.com
foo@gmail.com
foo@gmail.com, 123@zxc.com, qwe@rt.com
foo@gmail.com, asd@qwert.edu
foo@gmail.com, foo@hotmail.com
foo@gmail.com

关于sql - 使用 Oracle Regexp 从字段中提取电子邮件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21286245/

相关文章:

Javascript正则表达式匹配捕获返回整个匹配,而不是组

mysql - 如何避免mysql查询中出现重复的子句

mysql - MYSQL 查询速度慢,需要帮助理解索引

sql - 在 Presto 中将两列转换为键值对 JSON 字符串

sql - 甲骨文SQL事业部

java - 使用java代码运行oracle脚本

c++ - 使用 oracle 的 OTT 实用程序时遇到问题

php - MySQL:如果所有值都存在则返回真

谷歌分析中的正则表达式查找特定标签和文件夹

javascript - 在模式匹配的一部分时引用 "*/"