REGEXP_REPLACE用于替换除特定域之外的列表中的电子邮件

时间:2017-07-28 10:36:34

标签: sql oracle plsql regexp-replace

我是正则表达式的新手。我正在尝试从列表中删除不属于特定域的电子邮件。

例如我有一个下面的电子邮件列表:

John@yahoo.co.in , Jacob@gmail.com, Bob@rediff.com,
Lisa@abc.com, sam@gmail.com , rita@yahoo.com

我只需要获取gmail ID:

Jacob@gmail.com, sam@gmail.com

请注意我们在逗号分隔符之前可能有空格。 感谢任何帮助!

3 个答案:

答案 0 :(得分:2)

这可能是你的开始。

SELECT *
  FROM (    SELECT REGEXP_SUBSTR (str,
                                  '[[:alnum:]\.\+]+@gmail.com',
                                  1,
                                  LEVEL)
                      AS SUBSTR
              FROM (SELECT ' John@yahoo.co.in , Jacob.foo@gmail.com,   Bob@rediff.com,Lisa@abc.com, sam@gmail.com , sam.bar+stackoverflow@gmail.com, rita@yahoo.com, foobar '
                              AS str
                      FROM DUAL)
        CONNECT BY LEVEL <= LENGTH (REGEXP_REPLACE (str, '[^,]+')) + 1)
 WHERE SUBSTR IS NOT NULL ;

再加上几个例子,但是电子邮件检查员应该遵守相应的RFC,查看维基百科,了解有关它们的更多信息https://en.wikipedia.org/wiki/Email_address

来自https://stackoverflow.com/a/17597049/869069

的灵感

答案 1 :(得分:0)

这是一种使用CTE的方法,仅用于解决问题。第一步是制作CTE&#34;表&#34;包含已解析的列表元素。然后从那里选择。 CTE正则表达式处理NULL列表元素。

with main_tbl(email) as (
  select ' John@yahoo.co.in , Jacob.foo@gmail.com,   Bob@rediff.com,Lisa@abc.com, sam@gmail.com , sam.bar+stackoverflow@gmail.com, rita@yahoo.com, foobar '
  from dual
),
email_list(email_addr) as (
  select trim(regexp_substr(email, '(.*?)(,|$)', 1, level, NULL, 1))
  from main_tbl
  connect by level <= regexp_count(email, ',')+1
)
-- select * from email_list;
select LISTAGG(TRIM(email_addr), ', ') WITHIN GROUP ( ORDER BY email_addr )  
from email_list
where lower(email_addr) like '%gmail.com';

答案 2 :(得分:0)

您可以尝试只获取与该域匹配的电子邮件,而不是取消与特定域不匹配的电子邮件(在您的示例中为gmail.com):

WITH a1 AS (
    SELECT 'John@yahoo.co.in , Jacob@gmail.com, Bob@rediff.com,Lisa@abc.com, sam@gmail.com , rita@yahoo.com' AS email_list FROM dual
)
SELECT LISTAGG(TRIM(email), ',') WITHIN GROUP ( ORDER BY priority )
  FROM (
    SELECT REGEXP_SUBSTR(email_list, '[^,]+@gmail.com', 1, LEVEL, 'i') AS email
         , LEVEL AS priority
      FROM a1
   CONNECT BY LEVEL <= REGEXP_COUNT(email_list, '[^,]+@gmail.com', 1, 'i')
);

也就是说,Oracle可能不是最好的工具(你是否将这些电子邮件地址作为列表存储在某个表格中?如果是这样的话,那么@ GordonLinoff的评论很容易 - 如果可以的话,修复你的数据模型。) / p>