- 2.1 Representing Ordinary Strings
- 2.2 Representing Strings with Alternate Notations
- 2.3 Using Here-Documents
- 2.4 Finding the Length of a String
- 2.5 Processing a Line at a Time
- 2.6 Processing a Character or Byte at a Time
- 2.7 Performing Specialized String Comparisons
- 2.8 Tokenizing a String
- 2.9 Formatting a String
- 2.10 Using Strings as IO Objects
- 2.11 Controlling Uppercase and Lowercase
- 2.12 Accessing and Assigning Substrings
- 2.13 Substituting in Strings
- 2.14 Searching a String
- 2.15 Converting Between Characters and ASCII Codes
- 2.16 Implicit and Explicit Conversion
- 2.17 Appending an Item onto a String
- 2.18 Removing Trailing Newlines and Other Characters
- 2.19 Trimming Whitespace from a String
- 2.20 Repeating Strings
- 2.21 Embedding Expressions within Strings
- 2.22 Delayed Interpolation of Strings
- 2.23 Parsing Comma-Separated Data
- 2.24 Converting Strings to Numbers (Decimal and Otherwise)
- 2.25 Encoding and Decoding <tt>rot13</tt> Text
- 2.26 Encrypting Strings
- 2.27 Compressing Strings
- 2.28 Counting Characters in Strings
- 2.29 Reversing a String
- 2.30 Removing Duplicate Characters
- 2.31 Removing Specific Characters
- 2.32 Printing Special Characters
- 2.33 Generating Successive Strings
- 2.34 Calculating a 32-Bit CRC
- 2.35 Calculating the SHA-256 Hash of a String
- 2.36 Calculating the Levenshtein Distance Between Two Strings
- 2.37 Encoding and Decoding Base64 Strings
- 2.38 Expanding and Compressing Tab Characters
- 2.39 Wrapping Lines of Text
- 2.40 Conclusion
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 right 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, shown next, 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, as shown here:
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