2013-11-21 4 views
0

Я пытаюсь извлечь адрес электронной почты из строки. Большинство записей имеют одинаковую структуру, например:Извлечение адреса электронной почты из строки с использованием Oracle

From: John Doe Sent:Monday, October 10, 2013 11:59 AM 
To: '**[email protected]**'Cc:[email protected] (the lack of spaces is intentional) 

С другой стороны, некоторые из них имеют другой формат, т.е. не включают Cc :, и т.д. Цель состоит в том, чтобы извлечь To: адрес электронной почты, т.е. [email protected] в нашем примере.

Я пробовал использовать INSTR и SUBSTR, но не имел большой удачи. Есть ли способ извлечь этот адрес электронной почты, используя RegEx, или у кого-нибудь есть другие идеи.

+0

См [Использование регулярных экс нажатие для подтверждения адреса электронной почты] (http://stackoverflow.com/q/201323/427192). Не дубликат, но, возможно, полезный –

+0

возможный дубликат [Регулярное выражение в Oracle с REGEXP \ _SUBSTR] (http://stackoverflow.com/questions/18694152/regular-expression-in-oracle-with-regexp-substr) –

ответ

0

Было бы эту форму:

select 
    Ltrim(regexp_substr(column_name,'To:''[[:alpha:]][[:alnum:]]*.?[[:alnum:]]*@[[:alpha:]][[:alnum:]]*[.][[:alpha:]]+''',1,1),'To:') 
from 
    table_name; 

, конечно, предположения делаются здесь (например, только один адресат). Нужно будет использовать оператор чередования для покрытия других форм, с которыми можно столкнуться.

Что касается моего регулярного выражения:

буквенный класс символов + буквенно-цифровой символьный класс (ноль или более) + период (ноль или 1) + буквенно-цифровой символьный класс (ноль или более) @ + буквенный класс символов + алфавитно-цифровой символ класса (ноль или более)

+0

Нет только это не скомпилируется правильно (вам нужны дополнительные квадратные скобки вокруг классов символов POSIX), это действительно неправильно, хотя идея использования нескольких классов символов - это путь, по которому электронная почта не может начинаться с не-буквенно-цифрового символа в соответствии с RFC (я думаю, и если это не указано). – Ben

+0

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

1

Попробуйте это:

SELECT Trim(both '*' from Trim(both '''' from 
     Substr(eml, 
      instr(eml, 'To:') + 4, 
      CASE WHEN instr(eml, 'Cc:') > 0 
      THEN instr(eml, 'Cc:') - (instr(eml, 'To:') + 4) 
      ELSE 1000 END 
     ))) 
FROM emails; 

демо ->http://www.sqlfiddle.com/#!4/5f181/5

Смежные вопросы