bevanb
bevanb

Reputation: 8511

Gsub-ing multiple substrings to an empty string

I often remove substrings from strings by doing this:

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

What's a more concise/better way of excising long lists of substrings from a string in Ruby?

Upvotes: 3

Views: 1402

Answers (4)

Cary Swoveland
Cary Swoveland

Reputation: 110675

Edit2: Upon reflection, I think what I have below (or any solution that first breaks the string into an array of words) is really what you want. Suppose:

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

Which of the following would you want?

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

or

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

Alternatively,

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

:2tidE

Edit1: I've come to my senses and purged my solution. It was much too elaborate (and inefficient) for such a simple problem. I've just left an observation. :1tidE

If you want to end up with just a single space between words, you need to take a different tack:

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

Upvotes: 2

Mario Uher
Mario Uher

Reputation: 12397

I would go with nronas' answer, however people tend to forget about Regexp.union:

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

Upvotes: 7

sawa
sawa

Reputation: 168091

I already suggested this to Cary, but it's here:

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)

Upvotes: 1

nronas
nronas

Reputation: 181

You can always use regex when you gsubing :P. like:

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

I hope that helps

Upvotes: 3

Related Questions