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.
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
gsub! when sub! will do, right? Also note (per my answer) that you need the \A anchor and/or m flag in case the string has a newline before the text to match.Use String#slice
s = "Hey what's up @dude, @how's it going?"
s.slice(s.index("@how")..-1)
# => "@how's it going?"
0..s.index("@how")?index will return nil. So he should either check for nil before doing the slice, or plan to rescue the error that comes from passing an index of nil to slice.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?"
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?"]
>> "Hey what's up @dude, @how's it going?".partition("@how's")[-2..-1].join
=> "@how's it going?"
Case insensitive
>> "Hey what's up @dude, @HoW's it going?".partition(/@how's/i)[-2..-1].join
=> "@HoW's it going?"
Or using scan()
>> "Hey what's up @dude, @HoW's it going?".scan(/@how's.*/i)[0]
=> "@HoW's it going?"
m flag on that last regex to match any newlines that may follow.