Sig
Sig

Reputation: 5916

Splitting string based on word

I have a string composed by words divided by'#'. For instance 'this#is#an#example' and I need to extract the last word or the last two words according to the second to last word.

If the second to last is 'myword' I need the last two words otherwise just the last one.

'this#is#an#example' => 'example'
'this#is#an#example#using#myword#also' => 'myword#also'

Is there a better way than splitting and checking the second to last? perhaps using regular expression?

Thanks.

Upvotes: 1

Views: 68

Answers (2)

Santhosh
Santhosh

Reputation: 29124

str = 'this#is#an#example#using#myword#also'
array = str.split('#')
array[-2] == 'myword' ? array[-2..-1].join('#') : array[-1]

With regex:

'this#is#an#example'[/(myword\#)*\w+$/]
# => "example"

'this#is#an#example#using#myword#also'[/(myword\#)*\w+$/]
# => "myword#also" 

Upvotes: 1

Stefan
Stefan

Reputation: 114158

You can use the end-of-line anchor $ and make the myword# prefix optional:

str = 'this#is#an#example'
str[/(?:#)((myword#)?[^#]+)$/, 1]
#=> "example"

str = 'this#is#an#example#using#myword#also'
str[/(?:#)((myword#)?[^#]+)$/, 1]
#=> "myword#also"

However, I don't think using a regular expression is "better" in this case. I would use something like Santosh's (deleted) answer: split the line by # and use an if clause.

def foo(str)
  *, a, b = str.split('#')
  if a == 'myword'
    "#{a}##{b}"
  else
    b
  end
end

Upvotes: 3

Related Questions