使用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]在我们的示例中。
我试过使用INSTR
和SUBSTR
,但没有多少运气。有什么方法可以使用RegEx来提取此电子邮件地址,或者是否有任何其他想法。
这将是这个形式:
select
Ltrim(regexp_substr(column_name,'To:''[[:alpha:]][[:alnum:]]*.?[[:alnum:]]*@[[:alpha:]][[:alnum:]]*[.][[:alpha:]]+''',1,1),'To:')
from
table_name;
当然假设正在这里所作(例如只有一个收件人)组成。人们需要使用交替操作符来覆盖可能遇到的其他表单。
对于我的正则表达式:
字母字符类+字母数字字符类(零个或多个)+一个周期(0或1)+字母数字字符类(零个或多个)+字母字符类+字母数字字符类(零个或多个)
不是只有这样才能编译不正确(你需要在POSIX字符类中使用额外的方括号),但它确实是非常错误的,尽管使用多个字符类的想法是一种方式,因为电子邮件不能以非字母数字字符根据RFC(我认为,除非它被引用)。 – Ben
拿了点。我测试了一个简单的文字,它确实工作。真正想要使用替代运算符来涵盖其他可能的场景。 –
试试这个:
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://stackoverflow.com/q/201323/427192)。不是重复的,但可能有用 –
[与REGEXP \ _SUBSTR在Oracle中的正则表达式]可能的重复(http://stackoverflow.com/questions/18694152/regular-expression-in-oracle-with-regexp-substr) –