如何在没有负面展望的情况下使用regexp从电子邮件中排除某个域



对于以下数据,如何在带有REGEXP_LIKE的where子句上的一行中排除所有gmail.com作为域的电子邮件?由于数据库约束和业务逻辑,我需要使用REGEXP_LIKE上的regex排除它。关于如何附加到regex(由于plsql,没有负面展望(以排除,有什么想法吗?请告知。谢谢

WITH t AS
( 
SELECT 'brucewayne.1981@gmail.com' email
FROM dual  
UNION ALL  
SELECT 'clark_kent@gmail.com'
FROM dual  
UNION ALL  
SELECT '1Tonystark.1980@gmail.com'
FROM dual  
UNION ALL  
SELECT 'peter@parker.1989@yahoo.com'
FROM dual  
UNION ALL  
SELECT 'pete.1989@yahoo.com'
FROM dual  
UNION ALL  
SELECT 'yahoo.com'
FROM dual  
UNION ALL  
SELECT '123@yahoo.com' FROM dual
)    
SELECT *
FROM t    
WHERE REGEXP_LIKE (EMAIL,'^[^.]?[A-Za-z0-9!#$%&''*+-/=?^_`{|}~.]{1,62}[^.]?@[^.-]?[A-Za-z0-9.-]{1,253}[^.-].[A-Za-z]{2,256}$')

使用NOT LIKE排除

WHERE REGEXP_LIKE (EMAIL,'^[^.]?[A-Za-z0-9!#$%&''*+-/=?^_`{|}~.]{1,62}[^.]?@[^.-]?[A-Za-z0-9.-]{1,253}[^.-].[A-Za-z]{2,256}$')
AND EMAIL NOT LIKE '%@gmail.com'

只需使用包含'@gmail.com$'模式的NOT REGEXP_LIKE,其中使用$符号来指定以@gmail.com:结尾的电子邮件地址

SELECT *
FROM t
WHERE NOT REGEXP_LIKE( email,'@gmail.com$')

OR通过@符号后的提取部分过滤出字符串:

SELECT *
FROM t
WHERE REGEXP_SUBSTR( email,'[^@]+$') != 'gmail.com';

更新:(如果没有不等性不在,您也可以使用

SELECT *
FROM t
WHERE NVL(INSTR(REGEXP_SUBSTR( email,'[@gmail.com]+$'),'@gmail.com'),0)=0;

演示

最新更新