# # MatchData encapsulates the result of matching a Regexp against string. It is # returned by Regexp#match and String#match, and also stored in a global # variable returned by Regexp.last_match. # # Usage: # # url = 'https://docs.ruby-lang.org/en/2.5.0/MatchData.html' # m = url.match(/(\d\.?)+/) # => # # m.string # => "https://docs.ruby-lang.org/en/2.5.0/MatchData.html" # m.regexp # => /(\d\.?)+/ # # entire matched substring: # m[0] # => "2.5.0" # # # Working with unnamed captures # m = url.match(%r{([^/]+)/([^/]+)\.html$}) # m.captures # => ["2.5.0", "MatchData"] # m[1] # => "2.5.0" # m.values_at(1, 2) # => ["2.5.0", "MatchData"] # # # Working with named captures # m = url.match(%r{(?[^/]+)/(?[^/]+)\.html$}) # m.captures # => ["2.5.0", "MatchData"] # m.named_captures # => {"version"=>"2.5.0", "module"=>"MatchData"} # m[:version] # => "2.5.0" # m.values_at(:version, :module) # # => ["2.5.0", "MatchData"] # # Numerical indexes are working, too # m[1] # => "2.5.0" # m.values_at(1, 2) # => ["2.5.0", "MatchData"] # # ## Global variables equivalence # # Parts of last MatchData (returned by Regexp.last_match) are also aliased as # global variables: # # * `$~` is Regexp.last_match; # * `$&` is Regexp.last_match`[ 0 ]`; # * `$1`, `$2`, and so on are Regexp.last_match`[ i ]` (captures by number); # * `$`` is Regexp.last_match`.pre_match`; # * `$'` is Regexp.last_match`.post_match`; # * `$+` is Regexp.last_match`[ -1 ]` (the last capture). # # # See also "Special global variables" section in Regexp documentation. # class MatchData type capture = String | Symbol | int def initialize_copy: (MatchData instance) -> self # # Returns `true` if `object` is another MatchData object whose target string, # regexp, match, and captures are the same as `self`, `false` otherwise. # def ==: (MatchData other) -> bool | (untyped) -> false # # When arguments `index`, +start and `length`, or `range` are given, returns # match and captures in the style of Array#[]: # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # # => # # m[0] # => "HX1138" # m[1, 2] # => ["H", "X"] # m[1..3] # => ["H", "X", "113"] # m[-3, 2] # => ["X", "113"] # # When string or symbol argument `name` is given, returns the matched substring # for the given name: # # m = /(?.)(.)(?.+)/.match("hoge") # # => # # m['foo'] # => "h" # m[:bar] # => "ge" # # If multiple captures have the same name, returns the last matched substring. # # m = /(?.)(?.+)/.match("hoge") # # => # # m[:foo] #=> "oge" # # m = /\W(?.+)|\w(?.+)|(?.+)/.match("hoge") # # # m[:foo] #=> "oge" # def []: (capture backref, ?nil) -> String? | (int start, int length) -> Array[String?] | (range[int?] range) -> Array[String?] # # Returns the offset (in characters) of the beginning of the specified match. # # When non-negative integer argument `n` is given, returns the offset of the # beginning of the `n`th match: # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # # => # # m[0] # => "HX1138" # m.begin(0) # => 1 # m[3] # => "113" # m.begin(3) # => 3 # # m = /(т)(е)(с)/.match('тест') # # => # # m[0] # => "тес" # m.begin(0) # => 0 # m[3] # => "с" # m.begin(3) # => 2 # # When string or symbol argument `name` is given, returns the offset of the # beginning for the named match: # # m = /(?.)(.)(?.)/.match("hoge") # # => # # m[:foo] # => "h" # m.begin('foo') # => 0 # m[:bar] # => "g" # m.begin(:bar) # => 2 # # Related: MatchData#end, MatchData#offset, MatchData#byteoffset. # def begin: (capture backref) -> Integer? # # Returns a two-element array containing the beginning and ending byte-based # offsets of the *n*th match. *n* can be a string or symbol to reference a named # capture. # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # m.byteoffset(0) #=> [1, 7] # m.byteoffset(4) #=> [6, 7] # # m = /(?.)(.)(?.)/.match("hoge") # p m.byteoffset(:foo) #=> [0, 1] # p m.byteoffset(:bar) #=> [2, 3] # def byteoffset: (capture backref) -> ([Integer, Integer] | [nil, nil]) # # Returns the array of captures, which are all matches except `m[0]`: # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # # => # # m[0] # => "HX1138" # m.captures # => ["H", "X", "113", "8"] # # Related: MatchData.to_a. # def captures: () -> Array[String?] # # Returns the array of captures, which are all matches except `m[0]`: # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # # => # # m[0] # => "HX1138" # m.captures # => ["H", "X", "113", "8"] # # Related: MatchData.to_a. # alias deconstruct captures # # Returns a hash of the named captures for the given names. # # m = /(?\d{2}):(?\d{2}):(?\d{2})/.match("18:37:22") # m.deconstruct_keys([:hours, :minutes]) # => {:hours => "18", :minutes => "37"} # m.deconstruct_keys(nil) # => {:hours => "18", :minutes => "37", :seconds => "22"} # # Returns an empty hash if no named captures were defined: # # m = /(\d{2}):(\d{2}):(\d{2})/.match("18:37:22") # m.deconstruct_keys(nil) # => {} # def deconstruct_keys: (Array[Symbol]? array_of_names) -> Hash[Symbol, String?] # # Returns the offset (in characters) of the end of the specified match. # # When non-negative integer argument `n` is given, returns the offset of the end # of the `n`th match: # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # # => # # m[0] # => "HX1138" # m.end(0) # => 7 # m[3] # => "113" # m.end(3) # => 6 # # m = /(т)(е)(с)/.match('тест') # # => # # m[0] # => "тес" # m.end(0) # => 3 # m[3] # => "с" # m.end(3) # => 3 # # When string or symbol argument `name` is given, returns the offset of the end # for the named match: # # m = /(?.)(.)(?.)/.match("hoge") # # => # # m[:foo] # => "h" # m.end('foo') # => 1 # m[:bar] # => "g" # m.end(:bar) # => 3 # # Related: MatchData#begin, MatchData#offset, MatchData#byteoffset. # def end: (capture backref) -> Integer? # # Returns `true` if `object` is another MatchData object whose target string, # regexp, match, and captures are the same as `self`, `false` otherwise. # alias eql? == # # Returns the integer hash value for `self`, based on the target string, regexp, # match, and captures. # # See also Object#hash. # def hash: () -> Integer # # Returns a string representation of `self`: # # m = /.$/.match("foo") # # => # # m.inspect # => "#" # # m = /(.)(.)(.)/.match("foo") # # => # # m.inspect # => "# # # m.inspect # => "#" # # Related: MatchData#to_s. # def inspect: () -> String # # Returns size of the match array: # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # # => # # m.size # => 5 # alias length size # # Returns a hash of the named captures; each key is a capture name; each value # is its captured string or `nil`: # # m = /(?.)(.)(?.+)/.match("hoge") # # => # # m.named_captures # => {"foo"=>"h", "bar"=>"ge"} # # m = /(?.)(?.)/.match("01") # # => # # m.named_captures #=> {"a" => "0", "b" => "1"} # # m = /(?.)(?.)?/.match("0") # # => # # m.named_captures #=> {"a" => "0", "b" => nil} # # m = /(?.)(?.)/.match("01") # # => # # m.named_captures #=> {"a" => "1"} # # If keyword argument `symbolize_names` is given a true value, the keys in the # resulting hash are Symbols: # # m = /(?.)(?.)/.match("01") # # => # # m.named_captures(symbolize_names: true) #=> {:a => "1"} # def named_captures: () -> Hash[String, String?] | (symbolize_names: true) -> Hash[Symbol, String?] | (symbolize_names: boolish) -> Hash[String | Symbol, String?] # # Returns an array of the capture names (see [Named # Captures](rdoc-ref:Regexp@Named+Captures)): # # m = /(?.)(?.)(?.)/.match("hoge") # # => # # m.names # => ["foo", "bar", "baz"] # # m = /foo/.match('foo') # => # # m.names # => [] # No named captures. # # Equivalent to: # # m = /(?.)(?.)(?.)/.match("hoge") # m.regexp.names # => ["foo", "bar", "baz"] # def names: () -> Array[String] # # Returns the matched substring corresponding to the given argument. # # When non-negative argument `n` is given, returns the matched substring for the # `n`th match: # # m = /(.)(.)(\d+)(\d)(\w)?/.match("THX1138.") # # => # # m.match(0) # => "HX1138" # m.match(4) # => "8" # m.match(5) # => nil # # When string or symbol argument `name` is given, returns the matched substring # for the given name: # # m = /(?.)(.)(?.+)/.match("hoge") # # => # # m.match('foo') # => "h" # m.match(:bar) # => "ge" # def match: (capture backref) -> String? # # Returns the length (in characters) of the matched substring corresponding to # the given argument. # # When non-negative argument `n` is given, returns the length of the matched # substring for the `n`th match: # # m = /(.)(.)(\d+)(\d)(\w)?/.match("THX1138.") # # => # # m.match_length(0) # => 6 # m.match_length(4) # => 1 # m.match_length(5) # => nil # # When string or symbol argument `name` is given, returns the length of the # matched substring for the named match: # # m = /(?.)(.)(?.+)/.match("hoge") # # => # # m.match_length('foo') # => 1 # m.match_length(:bar) # => 2 # def match_length: (capture backref) -> Integer? # # Returns a 2-element array containing the beginning and ending offsets (in # characters) of the specified match. # # When non-negative integer argument `n` is given, returns the starting and # ending offsets of the `n`th match: # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # # => # # m[0] # => "HX1138" # m.offset(0) # => [1, 7] # m[3] # => "113" # m.offset(3) # => [3, 6] # # m = /(т)(е)(с)/.match('тест') # # => # # m[0] # => "тес" # m.offset(0) # => [0, 3] # m[3] # => "с" # m.offset(3) # => [2, 3] # # When string or symbol argument `name` is given, returns the starting and # ending offsets for the named match: # # m = /(?.)(.)(?.)/.match("hoge") # # => # # m[:foo] # => "h" # m.offset('foo') # => [0, 1] # m[:bar] # => "g" # m.offset(:bar) # => [2, 3] # # Related: MatchData#byteoffset, MatchData#begin, MatchData#end. # def offset: (capture backref) -> ([Integer, Integer] | [nil, nil]) # # Returns the substring of the target string from the end of the first match in # `self` (that is, `self[0]`) to the end of the string; equivalent to regexp # global variable `$'`: # # m = /(.)(.)(\d+)(\d)/.match("THX1138: The Movie") # # => # # m[0] # => "HX1138" # m.post_match # => ": The Movie"\ # # Related: MatchData.pre_match. # def post_match: () -> String # # Returns the substring of the target string from its beginning up to the first # match in `self` (that is, `self[0]`); equivalent to regexp global variable # `$``: # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # # => # # m[0] # => "HX1138" # m.pre_match # => "T" # # Related: MatchData#post_match. # def pre_match: () -> String # # Returns the regexp that produced the match: # # m = /a.*b/.match("abc") # => # # m.regexp # => /a.*b/ # def regexp: () -> Regexp # # Returns size of the match array: # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # # => # # m.size # => 5 # def size: () -> Integer # # Returns the target string if it was frozen; otherwise, returns a frozen copy # of the target string: # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # # => # # m.string # => "THX1138." # def string: () -> String # # Returns the array of matches: # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # # => # # m.to_a # => ["HX1138", "H", "X", "113", "8"] # # Related: MatchData#captures. # def to_a: () -> Array[String?] # # Returns the matched string: # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # # => # # m.to_s # => "HX1138" # # m = /(?.)(.)(?.+)/.match("hoge") # # => # # m.to_s # => "hoge" # # Related: MatchData.inspect. # def to_s: () -> String # # Returns match and captures at the given `indexes`, which may include any # mixture of: # # * Integers. # * Ranges. # * Names (strings and symbols). # # # Examples: # # m = /(.)(.)(\d+)(\d)/.match("THX1138: The Movie") # # => # # m.values_at(0, 2, -2) # => ["HX1138", "X", "113"] # m.values_at(1..2, -1) # => ["H", "X", "8"] # # m = /(?\d+) *(?[+\-*\/]) *(?\d+)/.match("1 + 2") # # => # # m.values_at(0, 1..2, :a, :b, :op) # # => ["1 + 2", "1", "+", "1", "2", "+"] # def values_at: (*capture | range[int?] backrefs) -> Array[String?] end