Ruby on rails Ruby动态创建中的正则表达式
我想在Rails应用程序中创建一个动态正则表达式。我的数据库中有一个名为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
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
版本中的转义$
。如果需要有选择地转义特定字符串,还可以使用(AKARegexp.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])