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

时间:2016-04-19 21:05:50

标签: mysql string

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

自由文本字段中有前后字符的许多不同变体,即:

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

我尝试过INSTR()SUBSTRING_INDEX()的变体来首先隔离"@"(可能是查找电子邮件的可靠常量...)并将字符提取到左侧(直到空格或不符合条件的字符,例如"-"":")并对@后面的文字执行相同操作。

但是 - 到目前为止我尝试过的所有内容都没有将噪音滤除到我需要的水平。

显然100%的准确率是不可能的,但是有人会介意如何构建我的select语句吗?

2 个答案:

答案 0 :(得分:1)

在MySQL中没有简单的解决方案。但是,在使用正则表达式检索它之后,您可以轻松地执行此操作。

以下是如何在您的案例中使用它的示例:https://jsfiddle.net/gusmgewg/

如果您希望从一个字符串中选择所有电子邮件地址:Regex example

您可以使用正则表达式来提取它在MySQL中包含电子邮件的那些,但它仍然不会从字符串中提取该组。这必须在MySQL之外完成

SELECT * FROM table
WHERE column RLIKE '\w*@\w*.\w*'

RLIKE仅用于匹配它,您可以在REGEXP中使用SELECT但是它只返回1或0是否找到了匹配项:s

如果您确实想在MySQL中提取它,那么另一个Regex Example可以帮助您解决问题。但这似乎是很多工作,而不是在MySQL之外做它

答案 1 :(得分:0)

现在在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})';