从字符串中删除某些集合中出现的单词

时间:2014-09-18 06:53:26

标签: ruby

我想删除字符串中某些字符集中的单词。一种方法是迭代此集合并使用str.gsub("subString", "")删除特定单词。这种功能是否已退出?

示例字符串:

"Hotel Silver Stone Resorts"

集合中的字符串:

["Hotel" , "Resorts"]

输出应为:

" Silver Stone "

4 个答案:

答案 0 :(得分:5)

您可以使用Regexp::union

构建多个模式的联合
words = ["Hotel" , "Resorts"]
re = Regexp.union(words)
#=> /Hotel|Resorts/

"Hotel Silver Stone Resorts".gsub(re, "")
#=> " Silver Stone "

请注意,您可能需要escape

答案 1 :(得分:1)

你可以在ruby中从另一个数组中减去一个数组。结果是第一个数组中的所有元素都从第二个数组中删除。

在空格上拆分字符串,在一次快速移动中删除所有额外的单词,重新加入句子。

s = "Hotel Silver Stone Resorts"

junk_words = ['Hotel', 'Resorts']

def strip_junk(original, junk)
  (original.split - junk).join(' ')
end

strip_junk(s, junk_words) # => "Silver Stone"

肯定看起来更好(我的眼睛)。不确定性能特征(懒得比较它)

答案 2 :(得分:0)

我不确定你想要什么,但据我所知

sentence = 'Hotel Silver Stone Resorts'
remove_words  = ["Hotel" , "Resorts"] # you can add words to this array which you wanted to remove
sentence.split.delete_if{|x| remove_words.include?(x)}.join(' ')
=> "Silver Stone"

如果你有一个字符串数组,那就容易了:

sentence = 'Hotel Silver Stone Resorts'
remove_words  = ["Hotel" , "Resorts"]
(sentence.split - remove_words).join(' ')
=> "Silver Stone"

答案 3 :(得分:0)

你可以尝试不同的东西,但我不知道它是否会更快(取决于字符串的长度和设置)

require 'set'
str = "Hotel Silver Stone Resorts"
setStr = Set.new(str.split)
setToRemove = Set.new( ["Hotel", "Resorts"])
modifiedStr = (setStr.subtract setToRemove).to_a.join " "

输出

"Silver Stone"

它使用Set类,它更快地检索单个元素(基于Hash构建)。 但是,如果你的字符串/集非常大,那么使用to_a的底层转换可能无法提高速度。

它还会隐式删除字符串和集合中的重复项(当您创建集合时)