'字符串#包括&#39?;对于多种模式

时间:2017-05-09 21:51:45

标签: ruby

从文字中,我如何排除数组中列出的某些关键字?

这是我的循环:

@entries.each do |entry|
entry.title.include? ("bad_word")
  (do nothing)
else
  puts entry.title

我也尝试过:

if ["bad_word"].include? entry.title

只要我只指定一个单词,第一位代码就可以工作。 "bad_word" || "naughty_word"只接受第一个。第二位代码似乎没有过滤任何内容。

2 个答案:

答案 0 :(得分:1)

您可以使用正则表达式:

/bad_word|naughty_word|another_bad_word/i

举个例子:

"Here's a bad_word" =~ /bad_word|naughty_word/i
# 9
"Here's a naughty_word" =~ /bad_word|naughty_word/i
# 9
"Here's a perfectly fine title" =~ /bad_word|naughty_word/i
# nil

一个潜在的问题是你会得到误报:

"He has skills" =~ /bad_word|naughty_word|kill/i
# 8

您可以尝试使用字边界来解决它:

"He has skills" =~ /\b(bad_word|naughty_word|kill)\b/i
# nil

但是你会得到假阴性:

"A kills B" =~ /\b(bad_word|naughty_word|kill)\b/i
# nil

您可以尝试使用以下方法解决问题:

"A kills B" =~ /\b(bad_word|naughty_word|kill[a-z]{,2})\b/i
# 2
"He has skills" =~ /\b(bad_word|naughty_word|kill[a-z]{,2})\b/i
# nil

然而,逻辑是如此模糊,文字检测,你无法找到解决问题的完美方案。

答案 1 :(得分:0)

或者您只需打印标题,除非这是一个坏词,就像在这个片段中一样:

<% unless ["bad_word1", "bad_word2"].include? entry.title %>
  # print the title
<% else %>
  # do sth else
<% end %>

也许更直接(unless - else逻辑可能会令人困惑):

<% if ["bad_word1", "bad_word2"].exclude? entry.title %>
  # print the title
<% else %>
  # do sth else
<% end %>