Section 2.13. Substituting in Strings


2.12. Accessing and Assigning Substrings

In Ruby, substrings may be accessed in several different ways. Normally the bracket notation is used, as for an array, but the brackets may contain a pair of Fixnums, a range, a regex, or a string. Each case is discussed in turn.

If a pair of Fixnum values is specified, they are treated as an offset and a length, and the corresponding substring is returned:

str = "Humpty Dumpty" sub1 = str[7,4]         # "Dump" sub2 = str[7,99]        # "Dumpty" (overrunning is OK) sub3 = str[10,-4]       # nil (length is negative)


It is important to remember that these are an offset and a length (number of characters), not beginning and ending offsets.

A negative index counts backward from the end of the string. In this case, the index is one-based, not zero-based. The length is still added in the forward direction:

str1 = "Alice" sub1 = str1[-3,3]   # "ice" str2 = "Through the Looking-Glass" sub3 = str2[-13,4]  # "Look"


A range may be specified. In this case, the range is taken as a range of indices into the string. Ranges may have negative numbers, but the numerically lower number must still be first in the range. If the range is "backward" or if the initial value is outside the string, nil is returned:

str = "Winston Churchill" sub1 = str[8..13]    # "Church" sub2 = str[-4..-1]   # "hill" sub3 = str[-1..-4]   # nil sub4 = str[25..30]   # nil


If a regular expression is specified, the string matching that pattern will be returned. If there is no match, nil will be returned:

str = "Alistair Cooke" sub1 = str[/l..t/]   # "list" sub2 = str[/s.*r/]   # "stair" sub3 = str[/foo/]    # nil


If a string is specified, that string will be returned if it appears as a substring (or nil if it does not):

str = "theater" sub1 = str["heat"]  # "heat" sub2 = str["eat"]   # "eat" sub3 = str["ate"]   # "ate" sub4 = str["beat"]  # nil sub5 = str["cheat"] # nil


Finally, in the trivial case, a single Fixnum as index will yield an ASCII code (or nil if out of range):

str = "Aaron Burr" ch1 = str[0]     # 65 ch1 = str[1]     # 97 ch3 = str[99]    # nil


It is important to realize that the notations described here will serve for assigning values as well as for accessing them:

str1 = "Humpty Dumpty" str1[7,4] = "Moriar"     # "Humpty Moriarty" str2 = "Alice" str2[-3,3] = "exandra"   # "Alexandra" str3 = "Through the Looking-Glass" str3[-13,13]  = "Mirror" # "Through the Mirror" str4 = "Winston Churchill" str4[8..13] = "H"        # "Winston Hill" str5 = "Alistair Cooke" str5[/e$/] ="ie Monster" # "Alistair Cookie Monster" str6 = "theater" str6["er"] = "re"        # "theatre" str7 = "Aaron Burr" str7[0] = 66             # "Baron Burr"


Assigning to an expression evaluating to nil will have no effect.




The Ruby Way(c) Solutions and Techniques in Ruby Programming
The Ruby Way, Second Edition: Solutions and Techniques in Ruby Programming (2nd Edition)
ISBN: 0672328844
EAN: 2147483647
Year: 2004
Pages: 269
Authors: Hal Fulton

flylib.com © 2008-2017.
If you may any questions please contact us: flylib@qtcs.net