The Ruby Way, Second Edition: Solutions and Techniques in Ruby Programming (2nd Edition)

2.14. Searching a String

Besides the techniques for accessing substrings, there are other ways of searching within strings. The index method returns the starting location of the specified substring, character, or regex. If the item is not found, the result is nil:

str = "Albert Einstein" pos1 = str.index(?E) # 7 pos2 = str.index("bert") # 2 pos3 = str.index(/in/) # 8 pos4 = str.index(?W) # nil pos5 = str.index("bart") # nil pos6 = str.index(/wein/) # nil

The method rindex (right index) starts from the righthand side of the string (that is, from the end). The numbering, however, proceeds from the beginning as usual:

str = "Albert Einstein" pos1 = str.rindex(?E) # 7 pos2 = str.rindex("bert") # 2 pos3 = str.rindex(/in/) # 13 (finds rightmost match) pos4 = str.rindex(?W) # nil pos5 = str.rindex("bart") # nil pos6 = str.rindex(/wein/) # nil

The include? method simply tells whether the specified substring or character occurs within the string:

str1 = "mathematics" flag1 = str1.include? ?e # true flag2 = str1.include? "math" # true str2 = "Daylight Saving Time" flag3 = str2.include? ?s # false flag4 = str2.include? "Savings" # false

The scan method repeatedly scans for occurrences of a pattern. If called without a block, it returns an array. If the pattern has more than one (parenthesized) group, the array will be nested:

str1 = "abracadabra" sub1 = str1.scan(/a./) # sub1 now is ["ab","ac","ad","ab"] str2 = "Acapulco, Mexico" sub2 = str2.scan(/(.)(c.)/) # sub2 now is [ ["A","ca"], ["l","co"], ["i","co"] ]

If a block is specified, the method passes the successive values to the block:

str3 = "Kobayashi" str3.scan(/[^aeiou]+[aeiou]/) do |x| print "Syllable: #{x}\n" end

This code produces the following output:

Syllable: Ko Syllable: ba Syllable: ya Syllable: shi

Категории