2016-08-18 10 views
-1

文字列から電子メールを抽出したいと思います。
私は文字列abc defg [email protected]を持っていて、文字列[email protected]を取得したいと考えています。文字列から電子メールを抽出する方法

どのようにPL/SQLで実行できますか?

+0

これを確認http://www.orafaq.com/forum/t/189919/ – Petaflop

+0

メールはいつも最後になるのですか? – sagi

+0

文字列を検索して、空白のinとしてLenを渡してから、そのintのngramトークンをフルスイングで取得することができます。その痛みはあるものの、やる気がなくなり、一貫しています。データサンプルがありますか? – Merenix

答えて

1

何かが多くの状況のた​​めに働くが、完璧には程遠いだろう。私はこれが失敗するかもしれない2つの異なる方法を示す1つの文字列を追加しました。可能性のあるすべての状況を捕捉するクエリを書くのは簡単ではありません。 「一致パターン」をさらに細分化するまでにどれくらいの時間がかかるのかは、入力データ内の電子メールがどれほど一般的ではないかによって決まります。

正規表現では、ドット(。)をバックスラッシュでエスケープし、一致するリスト(角括弧内の文字のリスト)内でハイフンを使用する必要があります。リストの最初または最後の文字、どこでもメタキャラクターです。

出力では、最後の行に注目してください。入力文字列は空であるため、出力もNULLになります。

with 
    input_strings (str) as (
     select 'sdss [email protected] sdsda sdsds '   from dual union all 
     select '[email protected] may not work'    from dual union all 
     select '[email protected], [email protected],[email protected]' from dual union all 
     select ''           from dual union all 
     select 'this string contains no email addresses'  from dual union all 
     select '-this:[email protected]_domain'   from dual union all 
     select '[email protected] [email protected]@mike.com'  from dual 
    ) 
select str as original_string, 
     level as idx, 
     regexp_substr(str, '[[:alnum:]_-][email protected][[:alnum:]_-]+\.[[:alnum:]_-]+', 1, level) 
                     as email_address 
from input_strings 
connect by regexp_substr(str, '[[:alnum:]_-][email protected][[:alnum:]_-]+\.[[:alnum:]_-]+', 1, level) 
                       is not null 
    and prior str = str 
    and prior sys_guid() is not null 
; 

ORIGINAL_STRING         IDX EMAIL_ADDRESS 
------------------------------------------- ---------- -------------------------------- 
-this:[email protected]_domain     1 [email protected]_domain 
[email protected] [email protected]@mike.com    1 [email protected] 
alpha[email protected] [email protected]@mike.com    2 [email protected] 
[email protected] may not work      1 [email protected] 
sdss [email protected] sdsda sdsds      1 [email protected] 
[email protected], [email protected],[email protected]   1 [email protected] 
[email protected], [email protected],[email protected]   2 [email protected] 
[email protected], [email protected],[email protected]   3 [email protected] 
this string contains no email addresses    1 
                1 

10 rows selected. 
関連する問題