Get substring after the first = symbol in Ruby

RubyString

Ruby Problem Overview


Purely out of curiosity, is there a more elegant way to simply get the substring after the first = symbol in a string? The following works to give back name=bob:

string = "option=name=bob"
string[string.index('=')+1..-1]

It just doesn't feel very Ruby. This also works:

string.split('=', 2)[1]

Again, not very elegant especially since split is doing extra unnecessary work. Are regular expressions the answer? I felt this was a little overkill for the simplicity of finding a single character position in a string:

string.match('=(.*)')[1]

I have to imagine this is an extremely common situation, isn't there a string.after('=') type method? Does Ruby on Rails provide something like this given the frequency this kind of operation is used over the web?

UPDATE: Forgot to mention the situation when the symbol is not found, nil or empty string should be returned. But the regular expression mechanism and .index method require an extra check for that (so less elegant).

Ruby Solutions


Solution 1 - Ruby

Not exactly .after, but quite close to:

string.partition('=').last

http://www.ruby-doc.org/core-1.9.3/String.html#method-i-partition

Solution 2 - Ruby

There's also this way:

string.partition('=')[2]

And this one:

string.sub(/.*?=/, '')

I think I prefer the regexp way you mentioned, though.

Solution 3 - Ruby

Probably not the Ruby-way (it's a bit cryptic), but you could do this:

string[/=/]
$'
=> "name=bob"

or

/=/ =~ string
$'
=> "name=bob"

$' is a global holding the string after a successful match. It's nil if nothing is matched, too!

Solution 4 - Ruby

Use String#match

You can use a regular expression with positive lookbehind to find your match. For example:

string = "option=name=bob"
string.match /(?<==).*/
# => #<MatchData "name=bob">
Use Match Variables to Access Result

Even if you haven't assigned the match data to a variable, Ruby will store it in special match variables for you.

$&
# => "name=bob"

Solution 5 - Ruby

split(char) is another function which can be used. For instance, we want to get substring before char ':' from "answer:computer" then, we can use "answer:computer".split(':')[0].So, we would get result as "answer".

Solution 6 - Ruby

Instead of using string.split('=', 2)[1] you could use array decomposition.

# assuming your string represents a key=value pair
key, value = string.split('=', 2)

Although this solution does not fit in one-liners I do find it pretty clean.

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
Questionat.View Question on Stackoverflow
Solution 1 - RubydimuchView Answer on Stackoverflow
Solution 2 - RubyThomasView Answer on Stackoverflow
Solution 3 - RubyBrian UstasView Answer on Stackoverflow
Solution 4 - RubyTodd A. JacobsView Answer on Stackoverflow
Solution 5 - RubyGaurav SachdevaView Answer on Stackoverflow
Solution 6 - Ruby3limin4t0rView Answer on Stackoverflow