# 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 public # Equality---Two matchdata are equal if their target strings, patterns, and # matched positions are identical. # def ==: (untyped other) -> bool # Match Reference -- MatchData acts as an array, and may be accessed using the # normal array indexing techniques. `mtch[0]` is equivalent to the special # variable `$&`, and returns the entire matched string. `mtch[1]`, `mtch[2]`, # and so on return the values of the matched backreferences (portions of the # pattern between parentheses). # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # m #=> # # m[0] #=> "HX1138" # m[1, 2] #=> ["H", "X"] # m[1..3] #=> ["H", "X", "113"] # m[-3, 2] #=> ["X", "113"] # # m = /(?a+)b/.match("ccaaab") # m #=> # # m["foo"] #=> "aaa" # m[:foo] #=> "aaa" # def []: (Integer idx) -> String? | (Integer start, Integer length) -> ::Array[String?] | (::Range[Integer] range) -> ::Array[String?] | (String | Symbol name) -> String? # Returns the offset of the start of the *n*th element of the match array in the # string. *n* can be a string or symbol to reference a named capture. # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # m.begin(0) #=> 1 # m.begin(2) #=> 2 # # m = /(?.)(.)(?.)/.match("hoge") # p m.begin(:foo) #=> 0 # p m.begin(:bar) #=> 2 # def begin: (Integer | String | Symbol n_or_name) -> Integer? # Returns the array of captures; equivalent to `mtch.to_a[1..-1]`. # # f1,f2,f3,f4 = /(.)(.)(\d+)(\d)/.match("THX1138.").captures # f1 #=> "H" # f2 #=> "X" # f3 #=> "113" # f4 #=> "8" # def captures: () -> ::Array[String?] # Returns the offset of the character immediately following the end of the *n*th # element of the match array in the string. *n* can be a string or symbol to # reference a named capture. # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # m.end(0) #=> 7 # m.end(2) #=> 3 # # m = /(?.)(.)(?.)/.match("hoge") # p m.end(:foo) #=> 1 # p m.end(:bar) #=> 3 # def `end`: (Integer | String | Symbol n_or_name) -> Integer? # Equality---Two matchdata are equal if their target strings, patterns, and # matched positions are identical. # def eql?: (untyped other) -> bool # Produce a hash based on the target string, regexp and matched positions of # this matchdata. # # See also Object#hash. # def hash: () -> Integer # Returns a printable version of *mtch*. # # puts /.$/.match("foo").inspect # #=> # # # puts /(.)(.)(.)/.match("foo").inspect # #=> # # # puts /(.)(.)?(.)/.match("fo").inspect # #=> # # # puts /(?.)(?.)(?.)/.match("hoge").inspect # #=> # # def inspect: () -> String # Returns the number of elements in the match array. # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # m.length #=> 5 # m.size #=> 5 # def length: () -> Integer # Returns a Hash using named capture. # # A key of the hash is a name of the named captures. A value of the hash is a # string of last successful capture of corresponding group. # # 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"} # # m = /(?x)|(?y)/.match("x") # m.named_captures #=> {"a" => "x"} # def named_captures: () -> ::Hash[String, String?] # Returns a list of names of captures as an array of strings. It is same as # mtch.regexp.names. # # /(?.)(?.)(?.)/.match("hoge").names # #=> ["foo", "bar", "baz"] # # m = /(?.)(?.)?/.match("a") #=> # # m.names #=> ["x", "y"] # def names: () -> ::Array[String] # Returns a two-element array containing the beginning and ending offsets of the # *n*th match. *n* can be a string or symbol to reference a named capture. # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # m.offset(0) #=> [1, 7] # m.offset(4) #=> [6, 7] # # m = /(?.)(.)(?.)/.match("hoge") # p m.offset(:foo) #=> [0, 1] # p m.offset(:bar) #=> [2, 3] # def offset: (Integer | Symbol | String n_or_name) -> ([ Integer, Integer ] | [ nil, nil ]) # Returns the portion of the original string after the current match. Equivalent # to the special variable `$'`. # # m = /(.)(.)(\d+)(\d)/.match("THX1138: The Movie") # m.post_match #=> ": The Movie" # def post_match: () -> String # Returns the portion of the original string before the current match. # Equivalent to the special variable `$``. # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # m.pre_match #=> "T" # def pre_match: () -> String # Returns the regexp. # # m = /a.*b/.match("abc") # m.regexp #=> /a.*b/ # def regexp: () -> Regexp # Returns the number of elements in the match array. # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # m.length #=> 5 # m.size #=> 5 # def size: () -> Integer # Returns a frozen copy of the string passed in to `match`. # # 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"] # # Because `to_a` is called when expanding `*`*variable*, there's a useful # assignment shortcut for extracting matched fields. This is slightly slower # than accessing the fields directly (as an intermediate array is generated). # # all,f1,f2,f3 = * /(.)(.)(\d+)(\d)/.match("THX1138.") # all #=> "HX1138" # f1 #=> "H" # f2 #=> "X" # f3 #=> "113" # def to_a: () -> ::Array[String?] # Returns the entire matched string. # # m = /(.)(.)(\d+)(\d)/.match("THX1138.") # m.to_s #=> "HX1138" # def to_s: () -> String # Uses each *index* to access the matching values, returning an array of the # corresponding matches. # # m = /(.)(.)(\d+)(\d)/.match("THX1138: The Movie") # m.to_a #=> ["HX1138", "H", "X", "113", "8"] # m.values_at(0, 2, -2) #=> ["HX1138", "X", "113"] # # m = /(?\d+) *(?[+\-*\/]) *(?\d+)/.match("1 + 2") # m.to_a #=> ["1 + 2", "1", "+", "2"] # m.values_at(:a, :b, :op) #=> ["1", "2", "+"] # def values_at: (*Integer | Symbol | String n_or_name) -> ::Array[String?] private def initialize_copy: (self object) -> void end