用于匹配 MySQL 中的 duplicate/alias 封电子邮件的正则表达式

Regex to match duplicate/alias e-mails in MySQL

我正在尝试想出一些正则表达式来检查数据库中是否存在电子邮件。这里更具体的是,我想找到相同但可能写法不同的电子邮件。 例如。 john.doe@example.comjohndode+123@example.comj.o.h.n.d.o.e@example.com 相同。

我使用另一个脚本删除了 + 之后的所有点和文本,以便 john.doe+123@example.com 变为 johndoe@example.com。我如何使用这个 "stripped" 地址来匹配它在 MySQL 数据库中的别名?

我对 RegEx 没有什么经验,之前也没有真正将它与 SQL 一起使用过。无论如何,我只能想出以下代码:

RegEx(匹配@符号

之前的所有+<any text>.
(\+.*(?=@)|\.(?=.*@))

SQL

SELECT email FROM users WHERE email REGEXP '(\+.*(?=@)|\.(?=.*@))'
//or
SELECT * from users WHERE email REGEXP_LIKE('johndoe@example.com', '(\+.*(?=@)|\.(?=.*@))')

两者都出现以下错误:

#1064 - You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near REGEXP_LIKE('johndoe@example.com', '(\+.*(?=@)|\.(?=.*@))')

我想做的是select email from users where email = 'johndoe@example.com' but disregard these characters (\+.*(?=@)|\.(?=.*@)
(代码作为准备语句执行)

任何提示或建议将不胜感激!

在 MySQL 中,最简单的方法可能是将问题分解为用户名和域:

where replace(substring_index(substring_index(email, '@', 1), '+', 1), '.', '') = substring_index('johndoe@example.com', '@', 1) and
      substring_index(email, '@', -1) = substring_index('johndoe@example.com', '@', -1) and
      email like '%@%' and
      email not like '%@%@%'