Rails、ActiveRecord、PostgreSQL 使用正则表达式在字符串中搜索单词

use*_*876 4 regex string postgresql ruby-on-rails rails-activerecord

我有一个使用 PostgreSQL 作为数据库的 Rails 4.1.x 应用程序。

我需要查询一列,以尝试在字符串的一部分上进行区分大小写的匹配,同时搜索单词的边界。正则表达式应该与 /keyword\b/i 内联,因此使用 %keyword% 不会削减它。我知道 postgres 支持正则表达式,但是我无法让它正常工作。我目前有以下内容:

Page.where("title ~* 'keyword/\b'").all
generages the following:
SELECT "pages".* FROM "pages"  WHERE (title ~* 'keyword')
Run Code Online (Sandbox Code Playgroud)

目前,这不会返回任何内容,即使我知道的记录包含“关键字”一词,我做错了什么?或者更确切地说,我该怎么做才能达到我的预期结果。

mu *_*ort 5

Ruby 被解释为退格键,因为您在双引号字符串中\b使用。\b例如,如果您查看:

"\b".bytes.to_a
Run Code Online (Sandbox Code Playgroud)

你会得到[8],这是一个退格字符。然后某个地方将该退格字符解释为真正的退格,并且您最终会在数据库内得到keyword(即最后一个斜杠退格)。keyword/

您不想说/\b,您想说的\\b是获取一个反斜杠,后跟一个b向下键进入数据库。但这仍然不起作用,因为\b将被解释为 PostgreSQL 正则表达式中的退格键

表 9-15。正则表达式字符输入转义
[...]
\b退格键,如 C 中那样

如果您要在单词末尾进行匹配,那么您需要\M

表 9-17。正则表达式约束转义
[...]
\M 仅在单词末尾匹配

每个人的正则表达式语法都略有不同,您必须对每个引擎使用正确的语法。

我想您正在寻找:

Page.where("title ~* 'keyword\\M'")
Run Code Online (Sandbox Code Playgroud)