2013-11-21 138 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) 

在另一方面,一些具有不同的格式,即不包括抄送:等我們的目標是提取爲:電子郵件地址,即[email protected]在我們的示例中。

我試過使用INSTRSUBSTR,但沒有多少運氣。有什麼方法可以使用RegEx來提取此電子郵件地址,或者是否有任何其他想法。

+0

參見[使用正恩壓力來驗證電子郵件地址](http://stackoverflow.com/q/201323/427192)。不是重複的,但可能有用 –

+0

[與REGEXP \ _SUBSTR在Oracle中的正則表達式]可能的重複(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; 

當然假設正在這裏所作(例如只有一個收件人)組成。人們需要使用交替操作符來覆蓋可能遇到的其他表單。

對於我的正則表達式:

字母字符類+字母數字字符類(零個或多個)+一個週期(0或1)+字母數字字符類(零個或多個)+字母字符類+字母數字字符類(零個或多個)

+0

不是隻有這樣才能編譯不正確(你需要在POSIX字符類中使用額外的方括號),但它確實是非常錯誤的,儘管使用多個字符類的想法是一種方式,因爲電子郵件不能以非字母數字字符根據RFC(我認爲,除非它被引用)。 – Ben

+0

拿了點。我測試了一個簡單的文字,它確實工作。真正想要使用替代運算符來涵蓋其他可能的場景。 –

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

相關問題