Sql REGEXP\u REPLACE可替换列表中除特定域以外的电子邮件
我是正则表达式的新手。我正在尝试从列表中删除不属于特定域的电子邮件 例如,我有以下电子邮件列表:Sql REGEXP\u REPLACE可替换列表中除特定域以外的电子邮件,sql,oracle,plsql,regexp-replace,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 请注意,逗号分隔符前可能有空格。 谢谢你的帮助 这可能是你的一个开始 SELECT * FROM (
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
请注意,逗号分隔符前可能有空格。
谢谢你的帮助 这可能是你的一个开始
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,查看维基百科以了解更多关于它们的信息
灵感来自这里有一种使用CTE的方法,只是为了对问题有不同的理解。第一步是创建一个包含已解析列表元素的CTE表。然后从中选择。CTE正则表达式处理空列表元素
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';
在您的示例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的评论很贴切——如果可以的话,请修复您的数据模型。使用%gmail.com作为“从表名中选择*”,其中的电子邮件%gmail.com可以修复您的数据模型。不要以字符串形式存储列表。这不是SQLish存储列表的方式。请使用REPLACE_REGEXP函数定义与要筛选出的域匹配的表达式,并将其替换为空字符串