你想使用Regexp.union
:
union(pat1, pat2, ...) → new_regexp
union(pats_ary) → new_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
。如果您需要有选择地转义特定字符串,还有Regexp.quote
(AKA )。Regexp.escape
通常,您不想只是将一堆随机字符串混合在一起来构建正则表达式,正则表达式语法字符每次都会让您受益;用于Regex.union
大交替或Regex.escape
在将它们放在一起之前将它们发送出去。
如果你想把它保存在数据库中,你也可以做一个 LIKE 查询:
Foo.where('phrase like ?', "%#{params[:some_text]}%")
或完全跳过所有模式匹配的内容及其转义问题并进行简单的字符串位置检查:
Foo.where('position(? in phrase) != 0', params[:some_text])
这两个都将进行表扫描,但您的Foo.all
.