使用MySQL从字符串中隔离电子邮件地址

3

我正在尝试从一段自由文本块中(列名为TEXT)隔离出一个电子邮件地址。

在自由文本字段中,存在许多不同的前导和后继字符变体,例如:

email me! john@smith.com
e:john@smith.com m:555-555-5555
john@smith.com--personal email

我尝试了各种INSTR()SUBSTRING_INDEX()的变化,首先隔离"@"(可能是发现电子邮件中唯一可靠的常数...),并提取左侧字符(直到空格或类似"-"":"的非资格字符),然后对跟随@的文本执行相同的操作。

但是,到目前为止,我尝试的所有方法都没有过滤掉我需要的噪声。

显然,100%的准确性是不可能的,但是否有人能够尝试如何构造我的选择语句?

2个回答

2
在MySQL中没有简单的解决方案来做到这一点。但是,您可以在使用正则表达式检索后轻松地完成此操作。 以下是如何在您的情况下使用它的示例:正则表达式示例 如果您想从一个字符串中选择所有电子邮件地址:正则表达式示例 您可以使用正则表达式在MySQL中提取其中包含电子邮件的内容,但仍然无法从字符串中提取组。这必须在MySQL之外完成。
SELECT * FROM table
WHERE column RLIKE '\w*@\w*.\w*'
RLIKE 只能用于匹配,你可以在 SELECT 中使用 REGEXP,但它只会返回 1 或 0 来表示是否找到了匹配项 :s。如果您想在 MySQL 中提取它,也许这篇stackoverflow帖子会对您有所帮助。但是与在 MySQL 外部进行操作相比,这似乎需要更多的工作。

使用正则表达式验证电子邮件本身就是一场噩梦。https://dev59.com/uHVC5IYBdhLWcg3wtzut - Elzo Valugi
@ElzoValugi 当然,我制作了一个非常基本的正则表达式,因为电子邮件可能包含数字和某些特殊字符。Thomas在他的问题中说他并不追求100%的准确性。最好从一开始就确保输入干净,而不是试图从随机文本中提取电子邮件地址,这肯定无法获得100%的准确性。 - Jester

1

现在在MySQL 5和8中,您可以使用REGEXP_SUBSTR从一段自由文本中仅隔离出电子邮件地址。

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

如果您想获取仅包含电子邮件且去重的记录...
SELECT DISTINCT REGEXP_SUBSTR(`TEXT`, '([a-zA-Z0-9._%+\-]+)@([a-zA-Z0-9.-]+)\.([a-zA-Z]{2,4})') AS Emails FROM `mytable` WHERE `TEXT` REGEXP '([a-zA-Z0-9._%+\-]+)@([a-zA-Z0-9.-]+)\.([a-zA-Z]{2,4})';

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接