Returns the integer position of the first substring that matches the given argument +pattern+,
or +nil+ if none found.

When +pattern+ is a string,
returns the index of the first matching substring in +self+:

  'foo'.index('f')         # => 0
  'foo'.index('o')         # => 1
  'foo'.index('oo')        # => 1
  'foo'.index('ooo')       # => nil
  'тест'.index('с')        # => 2  # Characters, not bytes.
  'こんにちは'.index('ち')  # => 3

When +pattern+ is a Regexp, returns the index of the first match in +self+:

  'foo'.index(/o./) # => 1
  'foo'.index(/.o/) # => 0

When +offset+ is non-negative, begins the search at position +offset+;
the returned index is relative to the beginning of +self+:

  'bar'.index('r', 0)        # => 2
  'bar'.index('r', 1)        # => 2
  'bar'.index('r', 2)        # => 2
  'bar'.index('r', 3)        # => nil
  'bar'.index(/[r-z]/, 0)    # => 2
  'тест'.index('с', 1)       # => 2
  'тест'.index('с', 2)       # => 2
  'тест'.index('с', 3)       # => nil  # Offset in characters, not bytes.
  'こんにちは'.index('ち', 2) # => 3

With negative integer argument +offset+, selects the search position by counting backward
from the end of +self+:

  'foo'.index('o', -1)  # => 2
  'foo'.index('o', -2)  # => 1
  'foo'.index('o', -3)  # => 1
  'foo'.index('o', -4)  # => nil
  'foo'.index(/o./, -2) # => 1
  'foo'.index(/.o/, -2) # => 1

Related: see {Querying}[rdoc-ref:String@Querying].
