在 sqlite 或 mysql 中使用正则表达式

发布于 2024-10-31 22:58:48 字数 318 浏览 1 评论 0原文

我正在使用 sqlite3 来尝试查找拥有 Gmail、Yahoo 或 Hotmail 电子邮件地址的用户。它需要仅根据域名的第一部分来执行此操作,因此我希望接受任何包含 @yahoo 的地址。

从文档中可以看出,在查询 sqlite 数据库时不可能使用正则表达式。有没有优雅的方式来做类似的事情?似乎不可能使用带有多个选项的“like/in”(例如:LIKE (%@yahoo%, %@gmail%, %@hotmail%)?

如果失败,我可能会切换到 MySQL reg exp 因为我想让解决方案保持简单和优雅,并且 DB 不是主要因素,如何在 MySQL 中编写regexp 查询?

I'm using sqlite3 to try and find users who have an e-mail address that is either with Gmail, Yahoo or Hotmail. It needs to do this just on the basis of the first part of the domain, so I want any address that had the @yahoo to be accepted.

It appears from documentation that it is not possible to use a regular expression when querying an sqlite database. Is there any elegant way of doing something similar? It doesn't seem to be possible to use a "like/in" with multiple options (eg: LIKE (%@yahoo%, %@gmail%, %@hotmail%)?

Failing that, I may switch over to MySQL for a reg exp as I want to keep the solution simple and elegant and DB isn't a major factor. How would said regexp query be written in MySQL?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

倾`听者〃 2024-11-07 22:58:48

您不能以这种方式使用多个“LIKE”,但您可以使用:

(email LIKE "%@yahoo%" OR email LIKE "%@gmail%" OR ....)

You can't use multiple "LIKE" in that way but you can use:

(email LIKE "%@yahoo%" OR email LIKE "%@gmail%" OR ....)
李白 2024-11-07 22:58:48

你可以使用 Nemoden 使用的方式或类似的东西(未测试)

WHERE email REGEXP '[\w\.]+@(yahoo|gmail|ymail|hotmail)\.(com|ru|co\.uk)'

这会快得多,因为 LIKE %string% OR ... 非常慢并且不使用任何索引(不知道 REGEXP 是否使用索引)。

you can use the way Nemoden is using or something like this (not tested)

WHERE email REGEXP '[\w\.]+@(yahoo|gmail|ymail|hotmail)\.(com|ru|co\.uk)'

This would be much faster because LIKE %string% OR ... is very slow and doesnt use any indexes(dont know if REGEXP uses indexes tho).

终止放荡 2024-11-07 22:58:48

我想你可能想要这样的东西(RLIKE函数):

WHERE email RLIKE '^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.([A-Z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum|travel)

如果你使用whatever_cs(区分大小写的排序规则),请使用a-zA-Z而不是AZ。

您还可以删除正则表达式中的 ^ 和 $。 ^ 表示“开始于”,$ 表示“结束于”

更新:

'.*@(gmail|hotmail|yahoo)\.[A-Z]{2,4}'

如果你使用whatever_cs(区分大小写的排序规则),请使用a-zA-Z而不是AZ。

您还可以删除正则表达式中的 ^ 和 $。 ^ 表示“开始于”,$ 表示“结束于”

更新:

I think you might want something like this (RLIKE function):

WHERE email RLIKE '^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.([A-Z]{2}|com|org|net|edu|gov|mil|biz|info|mobi|name|aero|asia|jobs|museum|travel)

If you use whatever_cs (case sensitive collation), use a-zA-Z instead of A-Z.

You can also get rid of ^ and $ in the regex. ^ means "starts with" and $ means "ends with"

UPDATE:

'.*@(gmail|hotmail|yahoo)\.[A-Z]{2,4}'

If you use whatever_cs (case sensitive collation), use a-zA-Z instead of A-Z.

You can also get rid of ^ and $ in the regex. ^ means "starts with" and $ means "ends with"

UPDATE:

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文