使用MySQL从字符串中隔离电子邮件地址
我试图从一块自由域文本(列名为text)中分离电子邮件地址 自由文本字段中的前后字符有许多不同的变体,即:使用MySQL从字符串中隔离电子邮件地址,mysql,string,Mysql,String,我试图从一块自由域文本(列名为text)中分离电子邮件地址 自由文本字段中的前后字符有许多不同的变体,即: email me! john@smith.com e:john@smith.com m:555-555-5555 john@smith.com--personal email 我尝试了INSTR()和SUBSTRING_INDEX()的变体,首先隔离“@”(可能是查找电子邮件时的一个可靠常数…)并提取左侧的字符(直到出现空格或非限定字符,如“-”或:“)并对@后面的文本执行相同的操作 然
email me! john@smith.com
e:john@smith.com m:555-555-5555
john@smith.com--personal email
我尝试了INSTR()
和SUBSTRING_INDEX()
的变体,首先隔离“@”
(可能是查找电子邮件时的一个可靠常数…)并提取左侧的字符(直到出现空格或非限定字符,如“-”
或:“
)并对@
后面的文本执行相同的操作
然而,到目前为止,我所尝试的一切都没有将噪音过滤到我需要的程度
显然,100%的准确率是不可能的,但有人介意试一试我如何构造select语句吗 在MySQL中没有简单的解决方案。但是,在使用正则表达式检索后,您可以轻松地执行此操作 下面是一个如何在您的案例中使用它的示例: 如果希望它从一个字符串中选择所有电子邮件地址: 您可以使用正则表达式提取MySQL中确实包含电子邮件的组,但它仍然无法从字符串中提取组。这必须在MySQL之外完成
SELECT * FROM table
WHERE column RLIKE '\w*@\w*.\w*'
RLIKE
仅用于匹配它,您可以在SELECT
中使用REGEXP
,但它仅返回1或0,无论是否找到匹配项:s
如果你真的想在MySQL中提取它,也许这另一个可以帮助你。但这似乎需要做大量的工作,而不是在MySQL之外进行现在在MySQL 5和8中,您可以使用REGEXP_SUBSTR将电子邮件从一块自由文本中分离出来
SELECT * FROM table
WHERE column RLIKE '\w*@\w*.\w*'
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})';
电子邮件的正则表达式验证本身就是一场噩梦@ElzoValugi当然,我做了一个非常基本的正则表达式,因为电子邮件可能也包含数字和某些字符。托马斯在他的问题中说,他的目标不是100%准确。最好是从一开始就确保输入的内容是干净的,而不是试图从随机文本中提取电子邮件地址,因为这样做肯定不可能在所有的文本中都获得100%的准确率