Ruby on rails Ruby动态创建中的正则表达式

Ruby on rails Ruby动态创建中的正则表达式,ruby-on-rails,ruby,regex,Ruby On Rails,Ruby,Regex,我想在Rails应用程序中创建一个动态正则表达式。我的数据库中有一个名为foo的表foo由两列组成,id和phrase就是varchar(255)。我希望能够创建一个包含所有“短语”实例的巨型表达式,并查看传入参数是否与短语中的任何单词匹配。我原以为下面这样的方法可以做到,但似乎效果不太好。我做错了什么 # get all phrases phrases = Foo.all.map(&:phrase) regex = Regexp.new phrases.join('|') if p

我想在Rails应用程序中创建一个动态正则表达式。我的数据库中有一个名为
foo
的表
foo
由两列组成,
id
phrase
就是varchar(255)。我希望能够创建一个包含所有“短语”实例的巨型表达式,并查看传入参数是否与短语中的任何单词匹配。我原以为下面这样的方法可以做到,但似乎效果不太好。我做错了什么

# get all phrases
phrases = Foo.all.map(&:phrase)

regex = Regexp.new phrases.join('|')

if params[:some_text] =~ regex
  # something in params[:some_text] matched at least one phrase
end
也许还有别的事?你所做的对我有用,从等式中删除AR。

你想使用:

联合(第1部分、第2部分,…)→ 新的正则表达式
联合(部分)→ 新的_regexp

返回一个
Regexp
对象,该对象是给定模式的并集,即将匹配其任何部分。模式可以是
Regexp
对象,在这种情况下,它们的选项将被保留,也可以是
String
s

那么就这样:

regex = Regexp.union(phrases)
例如:

>> phrases = %w[pancakes egg$]
=> ["pancakes", "egg$"]
>> puts Regexp.new(phrases.join('|')).inspect
/pancakes|egg$/
>> puts Regexp.union(phrases).inspect
/pancakes|egg\$/
注意
union
版本中的转义
$
。如果需要有选择地转义特定字符串,还可以使用(AKA
Regexp.escape
)。一般来说,你不想只是把一堆随机字符串混在一起来构建一个正则表达式,正则表达式语法字符每次都会得到你;使用
Regex.union
进行一次大的替换,或者在组合之前通过
Regex.escape
发送您的作品

如果希望将其保留在数据库中,也可以执行类似的查询:

Foo.where('phrase like ?', "%#{params[:some_text]}%")
或者完全跳过所有模式匹配内容及其转义问题,并执行简单的字符串位置检查:

Foo.where('position(? in phrase) != 0', params[:some_text])

这两种方法都可以进行表格扫描,但是你的
Foo.all

为什么不直接进行
Foo.where(:phrase=>params[:some_text])。present?
因为如果
params[:some_text]==“Hello World”
而短语就是“World”,它不起作用。到底什么对你不起作用?我想问题是我数据库中的一些短语是
ba$$
(我正在尝试对elite speak进行简单的搜索和替换)以及$和!将不匹配为文本。有没有一种方法可以将它们翻译成文字,而不是它们特殊的正则表达式含义?如果
短语
包含类似
'string$'
的内容,这将失败,因为您没有转义正则表达式字符。
Foo.where('position(? in phrase) != 0', params[:some_text])