3.4. Using AnchorsAn anchor is a special expression that matches a position in a string rather than a character or sequence of characters. As we'll see later, this is a simple case of a zero-width assertion, a match that doesn't consume any of the string when it matches. The most common anchors were already listed at the beginning of this chapter. The simplest are ^ and $, which match the beginning and end of the string. string = "abcXdefXghi" /def/ =~ string # 4 /abc/ =~ string # 0 /ghi/ =~ string # 8 /^def/ =~ string # nil /def$/ =~ string # nil /^abc/ =~ string # 0 /ghi$/ =~ string # 8 However, I've told a small lie. These anchors don't actually match the beginning and end of the string but of the line. Consider the same patterns applied to a similar string with embedded newlines: string = "abc\ndef\nghi" /def/ =~ string # 4 /abc/ =~ string # 0 /ghi/ =~ string # 8 /^def/ =~ string # 4 /def$/ =~ string # 4 /^abc/ =~ string # 0 /ghi$/ =~ string # 8 However, we also have the special anchors \A and \Z, which match the real beginning and end of the string itself. string = "abc\ndef\nghi" /\Adef/ =~ string # nil /def\Z/ =~ string # nil /\Aabc/ =~ string # 0 /ghi\Z/ =~ string # 8 The \z is the same as \Z except that the latter matches before a terminating newline, whereas the former must match explicitly. string = "abc\ndef\nghi" str2 << "\n" /ghi\Z/ =~ string # 8 /\Aabc/ =~ str2 # 8 /ghi\z/ =~ string # 8 /ghi\z/ =~ str2 # nil It's also possible to match a word boundary with \b, or a position that is not a word boundary with \B. These gsub examples make it clear how this works: str = "this is a test" str.gsub(/\b/,"|") # "|this| |is| |a| |test|" str.gsub(/\B/,"-") # "t-h-i-s i-s a t-e-s-t" There is no way to distinguish between beginning and ending word boundaries. |