从mysql字段中提取电子邮件地址

时间:2013-06-12 16:28:34

标签: mysql

我的表中有一个longtext列“description”,有时包含一个电子邮件地址。我需要提取此电子邮件地址并添加到每行的单独列。这可以在MySQL中做到吗?

5 个答案:

答案 0 :(得分:3)

您不能仅使用纯Mysql从正则表达式匹配中选择匹配的部分。您可以使用mysql扩展(如Return matching pattern中所述,或使用脚本语言(例如PHP)。

答案 1 :(得分:2)

是的,您可以使用mysql的REGEXP(也许这是发布该问题之后的版本5和8的新功能。)

SELECT *, REGEXP_SUBSTR(`description`, '([a-zA-Z0-9._%+\-]+)@([a-zA-Z0-9.-]+)\.([a-zA-Z]{2,4})') AS Emails FROM `mytable`;

答案 2 :(得分:1)

MySQL 确实拥有regular expressions,但正则表达式不是match email addresses的最佳方式。我强烈建议您使用客户语言。

答案 3 :(得分:1)

您可以使用子字符串索引来捕获电子邮件地址......

第一个子字符串索引捕获帐户 第二个substring_index捕获主机名。如果列中存储了多个atso(@),则必须选择相同的电子邮件地址。

select concat( substring_index(substring_index(description,'@',1),' ',-1)
             , substring_index(substring_index( description,
                                                substring_index(description,'@',1),-1),
                               ' ',1))

答案 4 :(得分:0)

如果你可以安装lib_mysqludf_preg MySQL UDF,那么你可以这样做:

SET @regex = "/([a-z0-9!#\$%&'\*\+\/=\?\^_`\{\|\}~\-]+(?:\.[a-z0-9!#\$%&'\*\+\/=\?^_`{\|}~\-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+(?:[A-Z]{2}|aero|arpa|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|post|pro|tel|travel|xxx))/i";

SELECT 
    PREG_CAPTURE(@regex, description) 
FROM 
    example 
WHERE
    PREG_CAPTURE(@regex, description) > '';

description字段中提取第一个电子邮件地址。

我想不出另一个解决方案,因为REGEXP运算符只返回1或0,而不是正则表达式匹配的位置。