我正在尝试从一个免费字段文本块中隔离一个电子邮件地址(列名为TEXT)。
自由文本字段中有前后字符的许多不同变体,即:
email me! john@smith.com
e:john@smith.com m:555-555-5555
john@smith.com--personal email
我尝试过INSTR()
和SUBSTRING_INDEX()
的变体来首先隔离"@"
(可能是查找电子邮件的可靠常量...)并将字符提取到左侧(直到空格或不符合条件的字符,例如"-"
或":"
)并对@
后面的文字执行相同操作。
但是 - 到目前为止我尝试过的所有内容都没有将噪音滤除到我需要的水平。
显然100%的准确率是不可能的,但是有人会介意如何构建我的select语句吗?
答案 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})';