14

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.

7 Answers 7

21

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

Sign up to request clarification or add additional context in comments.

5 Comments

Considering that it could be in any case variation of @how (e.g. @How, @HOW, @HoW etc), could it be done like this: str.gsub(/.*?(?=@[Hh][Oo][Ww])/, "")?
sure, fixed. (/i have been added)
No need for 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.
Thanks! Sorry, I don't know the difference between gsub and sub. Could you explain it?
Suuuuper old and you obviously probably know the difference by now, but would be nice to see the answer changed for n00bs: gsub does a global search and replace while sub stops after the first match. gsub could cause unexpected results or poor performance is longer strings.
15

Use String#slice

s = "Hey what's up @dude, @how's it going?"
s.slice(s.index("@how")..-1)
# => "@how's it going?"

5 Comments

+1 very clean. Aren't the indices off though? Shouldn't it be 0..s.index("@how")?
He wants to strip everything before the match, that is the same to say "keep everything after the match".
Oh whoops, I misunderstood how splice worked. I thought it removed the string in place, like a delete method. I didn't realize it returned the spliced text for use.
I commented below to another answer, but I was wondering that since it could be in any case variation of @how (e.g. @How, @HOW, @HoW etc), could it be done like this: str.slice(str.index("@[Hh][Oo][Ww]")..-1)
If the search string doesn't appear, the 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.
8

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?"

Comments

2

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?"]

Comments

1

An easy way to get only the part you are interested in.

>> s="Hey what's up @dude, @how's it going?"
=> "Hey what's up @dude, @how's it going?"
>> s[/@how.*$/i]
=> "@how's it going?"

If you really need to change the string object, you could always do s=s[...].

Comments

0
>> "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?"

1 Comment

You need a m flag on that last regex to match any newlines that may follow.
0

You can also directly call [] also on a string(same as slice)

s = "Hey what's up @dude, @how's it going?"
start_index = s.downcase.index("@how")
start_index ? s[start_index..-1] : ""

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.