Как исключить определенный домен из электронной почты с помощью регулярных выражений без негативных последствий? - PullRequest
1 голос
/ 03 марта 2020

Для следующих данных, как я могу исключить всю электронную почту с gmail.com как домен в одну строку в предложении where с REGEXP_LIKE? Из-за ограничений базы данных и бизнес-логики c мне нужно исключить ее с помощью регулярного выражения REGEXP_LIKE. Любая идея о том, как добавить к регулярному выражению (без негативных перспектив из-за pl sql), чтобы исключить? Пожалуйста, порекомендуйте. Спасибо!

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}$')

Ответы [ 3 ]

2 голосов
/ 03 марта 2020

Используйте 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'
0 голосов
/ 03 марта 2020

РЕДАКТИРОВАТЬ: не использовать, но см. Мой комментарий ниже.

Добавление класса символов группы из [^(gmail)] (НЕ 'gmail' после знака at и перед точкой) после знака @ казалось, добился цели. Проведите тщательное тестирование!

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

Обязательно прокомментируйте этого плохого парня!

0 голосов
/ 03 марта 2020

Просто используйте NOT REGEXP_LIKE, содержащий шаблон '@gmail.com$', где знак $ используется для указания адреса электронной почты, заканчивающегося @gmail.com:

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

ИЛИ альтернативно, путем фильтрации строки через извлеченную часть после знака @:

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

Обновление: ( без неравенство или НЕ В , как вы хотите ), вы также можете использовать

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

Демо

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...