Thanks for your help, guys. All three suggestions are great.
It seems to me that returning an empty array instead of nil is actually
better.
Glenn
----- Original Message ----
From: Paul M. [email protected]
To: ruby-talk ML [email protected]
Sent: Wednesday, March 12, 2008 9:41:26 PM
Subject: Re: String method to take subsections
Glenn wrote:
Hi,
I’m looking for a method for the String class that returns an array of
strings based on two input strings.
Regular expressions are your friend here:
class String
def containedby(startmark=‘a’,endmark=‘b’)
self.scan(Regexp.new(startmark+‘([^’+endmark+‘]*)’+endmark)).flatten
end
end
should do what you want. If you want to restrict it to just one
character remove the * in ‘]*)’.
If you had the string ‘a1b2’ and tried ‘a1b2’.method_x(‘a’, ‘c’) you’d
get nil because ‘c’ is obviously not in the String that’s calling the
method.Likewise, if you tried ‘a1b2’.method_x(‘b’, ‘a’) it would also return
nil since there’s no string between ‘b’ and ‘a’ (so the order matters).
Actually returns [] in both these cases, but I’m sure you can deal with
those.
Test Listing and output below:
class String
def containedby(startmark=‘a’,endmark=‘b’)
self.scan(Regexp.new(Regexp.escape(startmark)+‘([^’+Regexp.escape(endmark)+‘]*)’+Regexp.escape(endmark))).flatten
end
end
TEST=‘xxxxxa1byyyyya2bzzzzzzz’
extracted=TEST.containedby(‘a’,‘b’)
puts extracted.inspect
extracted=TEST.containedby(‘a’,‘c’)
puts extracted.inspect
TEST2=‘b1a2’
extracted=TEST2.containedby(‘a’,‘b’)
puts extracted.inspect
=====================================
[“1”, “2”]
[]
[]