REGEXP_REPLACE для замены адресов электронной почты в списке, кроме определенного домена.

Я новичок в регулярных выражениях. Я пытаюсь удалить электронные письма из списка, которые не принадлежат определенному домену.

например У меня есть следующий список адресов электронной почты:

[email protected] , [email protected], [email protected],
[email protected], [email protected] , [email protected]

Мне нужно получить только идентификаторы Gmail:

[email protected], [email protected]

Обратите внимание, что перед разделителями-запятыми могут быть пробелы. Ценим любую помощь!


person user8380094    schedule 28.07.2017    source источник
comment
используйте like%gmail.com как Select * from Table_name, где электронная почта, как %gmail.com   -  person Pavan Kumar    schedule 28.07.2017
comment
Исправьте модель данных. Не храните списки в строках. Это не SQLish способ хранения списков.   -  person Gordon Linoff    schedule 28.07.2017
comment
Используйте функцию REPLACE_REGEXP, где вы определите выражения, соответствующие доменам, которые нужно отфильтровать, и замените их пустыми строками.   -  person Alexey R.    schedule 28.07.2017


Ответы (3)


Вместо того, чтобы подавлять электронные письма, не соответствующие определенному домену (в вашем примере gmail.com), вы можете попробовать получать только те электронные письма, которые соответствуют домену:

WITH a1 AS (
    SELECT '[email protected] , [email protected], [email protected],[email protected], [email protected] , [email protected]' AS email_list FROM dual
)
SELECT LISTAGG(TRIM(email), ',') WITHIN GROUP ( ORDER BY priority )
  FROM (
    SELECT REGEXP_SUBSTR(email_list, '[^,][email protected]', 1, LEVEL, 'i') AS email
         , LEVEL AS priority
      FROM a1
   CONNECT BY LEVEL <= REGEXP_COUNT(email_list, '[^,][email protected]', 1, 'i')
);

Тем не менее, Oracle, вероятно, не лучший инструмент для этого (у вас где-то хранятся эти адреса электронной почты в виде списка в таблице? Если да, то комментарий @GordonLinoff уместен - исправьте свою модель данных, если можете).

person David Faber    schedule 28.07.2017

Это может стать для вас началом.

SELECT *
  FROM (    SELECT REGEXP_SUBSTR (str,
                                  '[[:alnum:]\.\+][email protected]',
                                  1,
                                  LEVEL)
                      AS SUBSTR
              FROM (SELECT ' [email protected] , [email protected],   [email protected],[email protected], [email protected] , [email protected], [email protected], 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

person oey    schedule 28.07.2017

Вот метод, использующий CTE только для другого подхода к проблеме. Первый шаг — создать «таблицу» CTE, содержащую проанализированные элементы списка. Затем выберите из этого. Регулярное выражение CTE обрабатывает элементы списка NULL.

with main_tbl(email) as (
  select ' [email protected] , [email protected],   [email protected],[email protected], [email protected] , [email protected], [email protected], 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';
person Gary_W    schedule 28.07.2017