String method to take subsections

G

Glenn

[Note: parts of this message were removed to make it a legal post.]

Hi,

I'm looking for a method for the String class that returns an array of strings based on two input strings.

For example, if you had the string 'xxxxxa1byyyyya2bzzzzzzz' I'd like it to return the smaller strings between 'a' and b', but I don't want the smaller strings to include either 'a' or 'b'.

So, 'xxxxxa1byyyyya2bzzzzzzz'.method_x('a', 'b') would return ["1", "2"].

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).

I looked but didn't see anything quite like this.

Thanks!

Glenn
 
D

David A. Black

Hi --

Hi,

I'm looking for a method for the String class that returns an array of strings based on two input strings.

For example, if you had the string 'xxxxxa1byyyyya2bzzzzzzz' I'd like it to return the smaller strings between 'a' and b', but I don't want the smaller strings to include either 'a' or 'b'.

So, 'xxxxxa1byyyyya2bzzzzzzz'.method_x('a', 'b') would return ["1", "2"].

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).

I looked but didn't see anything quite like this.

Have a look at String#scan.

'xxxxxa1byyyyya2bzzzzzzz'.scan(/a(.*?)b/)
=> [["1"], ["2"]]

It may not be an exact fit for the calling syntax you want but you
could wrap it in something else.


David
 
T

Thomas Wieczorek

So, 'xxxxxa1byyyyya2bzzzzzzz'.method_x('a', 'b') would return ["1", "2"].

You could use String#scan and wrap it in a method or extend the String class:

# So, 'xxxxxa1byyyyya2bzzzzzzz'.method_x('a', 'b') would return ["1", "2"].

def method_x(str, first, last)
pattern = "#{first}(\\d)#{last}"
regexp = Regexp.new(pattern)
return str.scan(regexp).flatten
end

p method_x('xxxxxa1byyyyya2bzzzzzzz', 'a', 'b') #=> ["1", "2"].

# you could also extend the String class
class String
def method_x(first, last)
pattern = "#{first}(\\d)#{last}"
regexp = Regexp.new(pattern)
return self.scan(regexp).flatten
end
end

p 'xxxxxa1byyyyya2bzzzzzzz'.method_x('a', 'b')
 
P

Paul Mckibbin

Glenn said:
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"]
[]
[]
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,981
Messages
2,570,188
Members
46,732
Latest member
ArronPalin

Latest Threads

Top