将多个子串格式化为空字符串

时间:2014-08-21 06:33:22

标签: ruby gsub

我经常通过这样做从字符串中删除子串:

"don't use bad words like".gsub("bad", "").gsub("words", "").gsub("like", "")

从Ruby中的字符串中删除长子串列表的更简洁/更好的方法是什么?

4 个答案:

答案 0 :(得分:6)

我会选择nronas'回答,但人们往往会忘记Regexp.union

str = "don't use bad words like"
str.gsub(Regexp.union('bad', 'words', 'like'), '')
# or
str.gsub(Regexp.union(['bad', 'words', 'like']), '')

答案 1 :(得分:2)

你可以在gsubing时使用正则表达式:P。像:

str = "don't use bad words like"
str.gsub(/bad|words|like/, '')

我希望有帮助

答案 2 :(得分:1)

Edit2:经过反思,我认为下面的内容(或任何首先将字符串分解为单词数组的解决方案)实际上就是您想要的。假设:

str = "Becky darned her socks before playing badmitten."
bad_words = ["bad", "darn", "socks"]

您想要以下哪项?

str.gsub(Regexp.union(*bad_words), '')
  #=> "Becky ed her  before playing mitten."

(str.split - bad_words).join(' ')
  #=> "Becky darned her before playing badmitten."

可替换地,

bad_words.reduce(str.split) { |arr,bw| arr.delete(bw); arr }.join(' ')
  #=> "Becky darned her before playing badmitten."

<强>:2tidE

编辑1:我已经理解并清除了我的解决方案。对于这样一个简单的问题,它过于复杂(而且效率低下)。我刚刚离开了一个观察点。的:1tidE

如果你想在单词之间只留一个空格,你需要采取不同的方法:

(str.split - bad_words).join(' ')
  #=> "don't use

答案 3 :(得分:1)

我已经向Cary建议了这个,但它在这里:

bad_words = %w[bad words like]
h = Hash.new{|h, k| k}.merge(bad_words.product(['']).to_h)
"don't use bad words like".gsub(/\w+/, h)