regex 如何基于正则表达式执行活动记录搜索

raogr8fs  于 2022-11-18  发布在  其他
关注(0)|答案(3)|浏览(86)

我在我的Rails应用程序中有一个标准的User模型。包括名字、姓氏、电子邮件等。我正在尝试搜索符合特定条件的所有用户。
我知道我可以搜索特定的电子邮件地址,如下所示:

User.find_by_email('john@smith.com')

但是,假设我想找到所有拥有Gmail地址的用户(例如),理想情况下,这将通过以下方式完成:

User.find_by_email(/.*@gmail.com/)

但是这不起作用,它给出了一个TypeError: Cannot visit Regexp,我该如何执行这个activerecord搜索呢?

7dl7o3gd

7dl7o3gd1#

.find(_by)只返回第一个匹配项。由于您要查找 * 所有 * 具有Gmail地址的用户,因此需要使用.where
您可以轻松地将查询与某些正则表达式组合在一起:

对于Mysql,请使用REGEXP

User.where("email REGEXP ?", '.*@gmail.com')

对于Postgres,请使用regexp_matches

User.where("regexp_matches(email, ?)", '.*@gmail.com')
5tmbdcev

5tmbdcev2#

/.*@gmail.com/的例子中,要查找以已知子字符串结尾的字符串,实际上并不需要真正的正则表达式。相反,一个更快的替代方法是LIKE搜索:

User.where("email LIKE ?", '%@gmail.com')
8yparm6h

8yparm6h3#

从PostgreSQL Ver.14开始,@davegson的答案在Postgres中不起作用。这里有两种方法--对于不区分大小写的匹配,电子邮件地址应该是:

User.where("email ~* ?", '^.*@gmail.com$')
  # "~" for case-sensitive match
User.where("regexp_match(email, ?, ?) IS NOT NULL", '.*@gmail.com', 'i')

# Wrong way
User.where("regexp_matches(email, ?)", '.*@gmail.com')
 # => ERROR:  set-returning functions are not allowed in WHERE (PG::FeatureNotSupported)

PostgreSQL官方文档

相关问题