我的表中有一个longtext列“description”,有时包含一个电子邮件地址。我需要提取此电子邮件地址并添加到每行的单独列。这可以在MySQL中做到吗?
答案 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,而不是正则表达式匹配的位置。