2017-04-05 93 views
0

我正在使用Oracle 11.g.我想創建一個虛擬列,以便我可以從電子郵件地址找到電子郵件服務提供商。例如,我希望新列根據包含「[email protected]」的列eMailAddress顯示「verizon.net」。我想我需要一個正則表達式來查找電子郵件地址中「@」之後的所有內容柱。我不認爲11.g支持前瞻。我將如何爲此構造一個正則表達式? 感謝您關注此事。電子郵件服務提供商的正則表達式

Select regexp_substr(email_address, '@([[:alnum:]]+\.?){1,2}/?') 
From mail_recipient 
Where prim_key = 1; 

的實際代碼產生一個虛擬列如下:

Alter Table mail_recipient 
    Add (EMAIL_PROVIDER VARCHAR2(4000 BYTE) 
    Generated Always As 
    (regexp_substr(email_address, '@([[:alnum:]]+\.?){1,2}/?')) VIRTUAL); 
+0

上面的代碼似乎產生預期的結果,但我不知道我是否已經構造過於複雜的正則表達式。 – user3138025

+0

難道你不想在名稱中使用「 - 」和「_」嗎?另一方面,爲什麼在最後允許一個可選的「/」?我認爲「ver-iz_on.com」不符合你的正則表達式,但應該。另外「verizon」(注意缺少「。」)有幾個匹配選項(浪費時間)。效率更高的是@([[:alnum:] _-] +(\。[[:alnum:] _-] +){0,1})',未經測試。這隻有一種方法來匹配「verizon」和「verizon.com」(像你的)一樣。如何「@ post.another.com」(注意兩個點),如果匹配?我認爲它不會,至少不包括「.com」。你想添加一個字尾錨(「\ b」或其他)? – Yunnosch

+0

隨着信息我可以創建一個測試答案。您可能想要提供更多的樣本輸入和所需的輸出,即更多不同的想要匹配和不匹配的名稱示例。讓我知道是否perl正則表達式是好的,我不熟悉你的環境。 Sed,grep,egrep也可以提供給我。 – Yunnosch

回答

1

所以一些反饋迭代後,這是解決了有機磷農藥的問題:

'@([[:alnum:]_-]+(\.[[:alnum:]_-]+){0,})' 
  • 比賽更「緊緊地「以減少大量的回溯
  • 另外允許」[_-]「
  • 還允許任意數量的「.blabla」
相關問題