|
|
|
|
||||||
![]() |
|
|
LinkBack | Outils de la discussion |
|
|
#1 |
|
Messages: n/a
Hébergeur: |
[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 |
|
|
|
#2 |
|
Messages: n/a
Hébergeur: |
Hi --
On Thu, 13 Mar 2008, Glenn wrote: > 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 -- Upcoming Rails training from David A. Black and Ruby Power and Light: ADVANCING WITH RAILS, April 14-17 2008, New York City CORE RAILS, June 24-27 2008, London (Skills Matter) See http://www.rubypal.com for details. Berlin dates coming soon! |
|
|
|
#3 |
|
Messages: n/a
Hébergeur: |
On Thu, Mar 13, 2008 at 1:18 AM, Glenn <glenn_ritz@yahoo.com> wrote:
> > 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') |
|
|
|
#4 |
|
Messages: n/a
Hébergeur: |
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"] [] [] -- Posted via http://www.ruby-forum.com/. |
|
![]() |
| Outils de la discussion | |
|
|