MySQL正则表达式匹配至少2个点

bra*_*orf 1 regex mysql sql

考虑以下正则表达式

@(.*\..*){2,}
Run Code Online (Sandbox Code Playgroud)

预期行为:

a@b doesnt match
a@b.c doesnt match
a@b.c.d matches
a@b.c.d.e matches
and so on
Run Code Online (Sandbox Code Playgroud)

在正则表达式中测试它按预期工作。

在 mysql select 中使用它不能按预期工作。询问:

SELECT * FROM `users` where mail regexp '@(.*\..*){2,}'
Run Code Online (Sandbox Code Playgroud)

返回像这样的行

foo@example.com
Run Code Online (Sandbox Code Playgroud)

不应与给定的正则表达式匹配。为什么?

sha*_*t00 5

我想你的问题的答案就在这里。

\n\n
\n

由于 MySQL 在字符串中使用 C 转义语法(例如 \xe2\x80\x9c\\n\xe2\x80\x9d\n 来表示换行符),因此必须将任何 \xe2\x80\x9c\\\ 翻倍您在 REGEXP 字符串中使用的 xe2\x80\x9d。

\n
\n\n

MYSQL 参考

\n\n

因为你的中间点没有正确转义,所以它被视为另一个通配符,最后你的表达式实际上被折叠为@.{2,}@..+

\n\n

@anubhava\'s 的答案可能是你尝试做的更好的替代品,尽管我会注意到 @dasblinkenlight\'s 关于使用字符类的评论,[.]这将使得你可以轻松地放入你已经测试过的正则表达式正则表达式Pal。

\n