我的表中有一个长文本列“描述”,有时包含一个电子邮件地址。我需要提取此电子邮件地址并为每一行添加一个单独的列。这可以在MySQL中做到吗?
问问题
4386 次
5 回答
4
Yes, you can use mysql's REGEXP (perhaps this is new to version 5 and 8 which may be after this question was posted.)
SELECT *, REGEXP_SUBSTR(`description`, '([a-zA-Z0-9._%+\-]+)@([a-zA-Z0-9.-]+)\.([a-zA-Z]{2,4})') AS Emails FROM `mytable`;
于 2020-07-16T01:25:35.230 回答
3
您不能仅从使用纯 Mysql 的正则表达式匹配中选择匹配的部分。您可以使用 mysql 扩展(如返回匹配模式中所述,或使用脚本语言(例如 PHP)。
于 2013-06-12T16:35:20.580 回答
2
您可以使用子字符串索引来捕获电子邮件地址...
第一个子字符串索引捕获帐户。
第二个 substring_index 捕获主机名。如果列中存储了多个 atso (@),则必须选择相同的电子邮件地址。
select concat( substring_index(substring_index(description,'@',1),' ',-1)
, substring_index(substring_index( description,
substring_index(description,'@',1),-1),
' ',1))
于 2017-03-09T23:08:48.857 回答
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,而不是正则表达式匹配的位置。
于 2013-06-12T18:27:29.380 回答