Skip to content
instance method

String#rindex

(::Regexp | ::string pattern, ?::int offset) -> ::Integer?
rindex(pattern, offset = self.length) → integer or nil

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

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

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

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

Example
'foo'.rindex(/f/)   # => 0
'foo'.rindex(/o/)   # => 2
'foo'.rindex(/oo/)  # => 1
'foo'.rindex(/ooo/) # => nil

When offset is non-negative, it specifies the maximum starting position in the string to end the search:

Example
'foo'.rindex('o', 0) # => nil
'foo'.rindex('o', 1) # => 1
'foo'.rindex('o', 2) # => 2
'foo'.rindex('o', 3) # => 2

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

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

The last match means starting at the possible last position, not the last of longest matches:

Example
'foo'.rindex(/o+/) # => 2
$~                 # => #<MatchData "o">

To get the last longest match, combine with negative lookbehind:

Example
'foo'.rindex(/(?<!o)o+/) # => 1
$~                       # => #<MatchData "oo">

Or String#index with negative lookforward.

Example
'foo'.index(/o+(?!.*o)/) # => 1
$~                       # => #<MatchData "oo">

Related: see Querying.

See also #reverse! #rjust #reverse #rpartition also in 4.1 · 3.4 · 3.3 · 3.2 · 3.1 · 3.0