Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How do I remove all characters in a string until a substring is matched, in Ruby?

Tags:

string

regex

ruby

Say I have a string: Hey what's up @dude, @how's it going?

I'd like to remove all the characters before@how's.

like image 588
oxo Avatar asked Mar 31 '11 14:03

oxo


4 Answers

or with the regex:

str = "Hey what's up @dude, @how's it going?"
str.gsub!(/.*?(?=@how)/im, "") #=> "@how's it going?"

you can read about lookaround at here

like image 87
Vasiliy Ermolovich Avatar answered Oct 19 '22 20:10

Vasiliy Ermolovich


Use String#slice

s = "Hey what's up @dude, @how's it going?"
s.slice(s.index("@how")..-1)
# => "@how's it going?"
like image 45
Simone Carletti Avatar answered Oct 19 '22 22:10

Simone Carletti


There are literally tens of ways of doing this. Here are the ones I would use:

If you want to preserve the original string:

str = "Hey what's up @dude, @how's it going?"
str2 = str[/@how's.+/mi]
p str, str2
#=> "Hey what's up @dude, @how's it going?"
#=> "@how's it going?"

If you want to mutate the original string:

str = "Hey what's up @dude, @how's it going?"
str[/\A.+?(?=@how's)/mi] = ''
p str
#=> "@how's it going?"

...or...

str = "Hey what's up @dude, @how's it going?"
str.sub! /\A.+?(?=@how's)/mi, ''
p str
#=> "@how's it going?"

You need the \A to anchor at the start of the string, and the m flag to ensure that you are matching across multiple lines.

Perhaps simplest of all for mutating the original:

str = "Hey what's up @dude, @how's it going?"
str.replace str[/@how's.+/mi]
p str
#=> "@how's it going?"
like image 7
Phrogz Avatar answered Oct 19 '22 20:10

Phrogz


String#slice and String#index work fine but will blow up with ArgumentError: bad value for range if the needle is not in the haystack.

Using String#partition or String#rpartition might work better in that case:

s.partition "@how's"
# => ["Hey what's up @dude, ", "@how's", " it going?"]
s.partition "not there"
# => ["Hey what's up @dude, @how's it going?", "", ""]
s.rpartition "not there"
# => ["", "", "Hey what's up @dude, @how's it going?"]
like image 2
Martin Vidner Avatar answered Oct 19 '22 20:10

Martin Vidner