user1429322
user1429322

Reputation: 1286

Get the word after a particular word in a Ruby string?

How do I get the word after a particular word in a Ruby string?

For example:

From:Ysxrb<[email protected]>\nTo: <[email protected]>Subject: xyzabc\nDate: Tue, 19 Jun 2012   03:26:56 -0700\nMessage-ID: <9D.A1.02635.ABB40EF4@ecout1>

I just want to get:

Ysxrb<[email protected]

xyzabc

Upvotes: 4

Views: 3504

Answers (3)

Franco Rondini
Franco Rondini

Reputation: 11001

You could try a regexp, here's an example:

>> s = "From:Ysxrb\nTo: Subject: xyzabc\nDate: Tue, 19 Jun 2012 03:26:56 -0700\nMessage-ID: <9D.A1.02635.ABB40EF4@ecout1>"
=> "From:Ysxrb\nTo: Subject: xyzabc\nDate: Tue, 19 Jun 2012 03:26:56 -0700\nMessage-ID: <9D.A1.02635.ABB40EF4@ecout1>"
>> m, w1, w2 = s.match(/^From:(\w*)\W+.*Subject: (\w*)/).to_a
=> ["From:Ysxrb\nTo: Subject: xyzabc", "Ysxrb", "xyzabc"]
>> w1
=> "Ysxrb"
>> w2
=> "xyzabc"

to find out a good regexp for your requirements, you may use rubular, a Ruby regular expression editor

Upvotes: 0

rodacato
rodacato

Reputation: 21

You can use a regular expresion, try this on a irb console:

string = "From:Ysxrb<[email protected]>\nTo: <[email protected]>Subject:"
/From:(.+)\n/.match string
$1

$1 hold the backreference we capture with the parenthesis in the regular expression

Upvotes: 0

MotownJoe
MotownJoe

Reputation: 78

I think your question/requirement may need a bit of refinement.

You state: "How to get the word after a particular word in a ruby string?" and your example text is this : "From:Ysxrb\nTo: Subject: xyzabc\nDate: Tue, 19 Jun 2012 03:26:56 -0700\nMessage-ID: <9D.A1.02635.ABB40EF4@ecout1>"

and then you finally say that what you really want out of these string are the following words:

"'Ysxrb' and 'xyzabc'".

Will you always be parsing email text, which is what this appears to be? If so, then there are some more specific approaches you could take. For instance, in this example you could do something like this:

eml = "From:Ysxrb\nTo: Subject: xyzabc\nDate: Tue, 19 Jun 2012 03:26:56 -0700\nMessage-ID: <9D.A1.02635.ABB40EF4@ecout1>"
tokens = eml.split(/[\s\:]/)

which would yield this:

["From", "Ysxrb", "To", "", "Subject", "", "xyzabc", "Date", "", "Tue,", "19", "Jun", "2012",     "03", "26", "56", "-0700", "Message-ID", "", "<9D.A1.02635.ABB40EF4@ecout1>"]

At this point, if the word following "To" and "Subject" are what you're after, you could simply get the first non-blank array element after each one, like this:

tokens[tokens.find_index("From") + 1]  => "Ysxrb"
tokens[tokens.find_index("Subject") + 2]  => "xyzabc"  # + 2 is needed because of the newline.

Upvotes: 4

Related Questions