2.14. Searching a StringBesides 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 |