我经常通过这样做从字符串中删除子串:
"don't use bad words like".gsub("bad", "").gsub("words", "").gsub("like", "")
从Ruby中的字符串中删除长子串列表的更简洁/更好的方法是什么?
答案 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)