使用Oracle从字符串中提取电子邮件地址

问题描述:

我试图从字符串中提取电子邮件地址。大部分的项目都具有类似的结构,例如:使用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://*.com/q/201323/427192)。不是重复的,但可能有用 –

+0

[与REGEXP \ _SUBSTR在Oracle中的正则表达式]可能的重复(http://*.com/questions/18694152/regular-expression-in-oracle-with-regexp-substr) –

这将是这个形式:

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

拿了点。我测试了一个简单的文字,它确实工作。真正想要使用替代运算符来涵盖其他可能的场景。 –

试试这个:

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