Returns a copy of self, possibly with a substring replaced.

Argument +pattern+ may be a string or a Regexp;
argument +replacement+ may be a string or a Hash.

Varying types for the argument values makes this method very versatile.

Below are some simple examples; for many more examples,
see {Substitution Methods}[rdoc-ref:String@Substitution+Methods].

With arguments +pattern+ and string +replacement+ given,
replaces the first matching substring with the given replacement string:

  s = 'abracadabra'       # => "abracadabra"
  s.sub('bra', 'xyzzy')   # => "axyzzycadabra"
  s.sub(/bra/, 'xyzzy')   # => "axyzzycadabra"
  s.sub('nope', 'xyzzy')  # => "abracadabra"

With arguments +pattern+ and hash +replacement+ given,
replaces the first matching substring with a value from the given replacement hash, or removes it:

  h = {'a' => 'A', 'b' => 'B', 'c' => 'C'}
  s.sub('b', h)  # => "aBracadabra"
  s.sub(/b/, h)  # => "aBracadabra"
  s.sub(/d/, h)  # => "abracaabra"  # 'd' removed.

With argument +pattern+ and a block given,
calls the block with each matching substring;
replaces that substring with the block’s return value:

  s.sub('b') {|match| match.upcase } # => "aBracadabra"

Related: see {Converting to New String}[rdoc-ref:String@Converting+to+New+String].
