如何在Ruby中检查字符串是否包含数组的一部分?

3

我有一个 Ruby 中的禁用词数组:

bw = ["test"]

我希望检查@nick是否匹配。

例如:

@nick = 'justatest'

将匹配。

我尝试过:

if @nick.include?(bw)
 ##
end

但这似乎不是正确的方法,因为它没有捕获它。


1
if bw.any? { |word| @nick =~ /#{word}/} 应该可以工作。示例 - engineersmnky
2个回答

2
@nick =~ Regexp.new(bw.map { |w| Regexp.escape(w) }.join('|'))

在这里,我们将bw中的所有字符串合并为一个正则表达式,并转义可能在正则表达式中具有特殊含义的符号,并检查输入是否与其匹配。

实现此功能的另一种方法是单独检查每个被列入黑名单的单词:

bw.any? { |w| @nick[Regexp.new(Regexp.escape(w))] }

希望它有所帮助。


这是一个更好的解决方案,除了Regexp.escape之外,我只是在我的评论中添加了它作为建议。 - engineersmnky
我看不出在这里使用正则表达式的好处(在第二个解决方案中)。 - undur_gongor
1
@undur_gongor 坦白地说,我也是。 - Aleksei Matiushkin

2
如果您的关注点只是检查(正如您问题的标题所示),那么:
> bw.any? { |word| @nick[word] }
=> true 

虽然将字符串数组转换为正则表达式可能更快:

> bw = ["test", "just", "gagan"]
> g = /#{bw.join("|")}/
> g === @nick 
 => true 

1
@nick.include?(word) 可以缩写为 @nick[word]。不确定这是否真的是一种改进。 - undur_gongor
@undur_gongor:感谢您提供的更短的技巧。我已经更新了我的答案 :) - Gagan Gami
我认为,如果您只需构建一次并经常查询,则正则表达式版本才更快。我刚试过(至少对于小列表),正则表达式的创建比遍历数组要昂贵得多。此外,您可能需要考虑转义特殊字符,如mudasobwa的答案中所述。 - undur_gongor
1
@undur_gongor 是的,正则表达式已经构建成稍微优化的形式。这需要更多的时间来进行构建,但会导致更快的检查结果。 - D-side

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接