elisp: Simple Match Data

 
 33.6.2 Simple Match Data Access
 -------------------------------
 
 This section explains how to use the match data to find out what was
 matched by the last search or match operation, if it succeeded.
 
    You can ask about the entire matching text, or about a particular
 parenthetical subexpression of a regular expression.  The COUNT argument
 in the functions below specifies which.  If COUNT is zero, you are
 asking about the entire match.  If COUNT is positive, it specifies which
 subexpression you want.
 
    Recall that the subexpressions of a regular expression are those
 expressions grouped with escaped parentheses, ‘\(...\)’.  The COUNTth
 subexpression is found by counting occurrences of ‘\(’ from the
 beginning of the whole regular expression.  The first subexpression is
 numbered 1, the second 2, and so on.  Only regular expressions can have
 subexpressions—after a simple string search, the only information
 available is about the entire match.
 
    Every successful search sets the match data.  Therefore, you should
 query the match data immediately after searching, before calling any
 other function that might perform another search.  Alternatively, you
 may save and restore the match data (SeeSaving Match Data) around
 the call to functions that could perform another search.  Or use the
 functions that explicitly do not modify the match data; e.g.,
 ‘string-match-p’.
 
    A search which fails may or may not alter the match data.  In the
 current implementation, it does not, but we may change it in the future.
 Don’t try to rely on the value of the match data after a failing search.
 
  -- Function: match-string count &optional in-string
      This function returns, as a string, the text matched in the last
      search or match operation.  It returns the entire text if COUNT is
      zero, or just the portion corresponding to the COUNTth
      parenthetical subexpression, if COUNT is positive.
 
      If the last such operation was done against a string with
      ‘string-match’, then you should pass the same string as the
      argument IN-STRING.  After a buffer search or match, you should
      omit IN-STRING or pass ‘nil’ for it; but you should make sure that
      the current buffer when you call ‘match-string’ is the one in which
      you did the searching or matching.  Failure to follow this advice
      will lead to incorrect results.
 
      The value is ‘nil’ if COUNT is out of range, or for a subexpression
      inside a ‘\|’ alternative that wasn’t used or a repetition that
      repeated zero times.
 
  -- Function: match-string-no-properties count &optional in-string
      This function is like ‘match-string’ except that the result has no
      text properties.
 
  -- Function: match-beginning count
      If the last regular expression search found a match, this function
      returns the position of the start of the matching text or of a
      subexpression of it.
 
      If COUNT is zero, then the value is the position of the start of
      the entire match.  Otherwise, COUNT specifies a subexpression in
      the regular expression, and the value of the function is the
      starting position of the match for that subexpression.
 
      The value is ‘nil’ for a subexpression inside a ‘\|’ alternative
      that wasn’t used or a repetition that repeated zero times.
 
  -- Function: match-end count
      This function is like ‘match-beginning’ except that it returns the
      position of the end of the match, rather than the position of the
      beginning.
 
    Here is an example of using the match data, with a comment showing
 the positions within the text:
 
      (string-match "\\(qu\\)\\(ick\\)"
                    "The quick fox jumped quickly.")
                    ;0123456789
           ⇒ 4
 
      (match-string 0 "The quick fox jumped quickly.")
           ⇒ "quick"
      (match-string 1 "The quick fox jumped quickly.")
           ⇒ "qu"
      (match-string 2 "The quick fox jumped quickly.")
           ⇒ "ick"
 
      (match-beginning 1)       ; The beginning of the match
           ⇒ 4                 ;   with ‘qu’ is at index 4.
 
      (match-beginning 2)       ; The beginning of the match
           ⇒ 6                 ;   with ‘ick’ is at index 6.
 
      (match-end 1)             ; The end of the match
           ⇒ 6                 ;   with ‘qu’ is at index 6.
 
      (match-end 2)             ; The end of the match
           ⇒ 9                 ;   with ‘ick’ is at index 9.
 
    Here is another example.  Point is initially located at the beginning
 of the line.  Searching moves point to between the space and the word
 ‘in’.  The beginning of the entire match is at the 9th character of the
 buffer (‘T’), and the beginning of the match for the first subexpression
 is at the 13th character (‘c’).
 
      (list
        (re-search-forward "The \\(cat \\)")
        (match-beginning 0)
        (match-beginning 1))
          ⇒ (17 9 13)
 
      ---------- Buffer: foo ----------
      I read "The cat ★in the hat comes back" twice.
              ^   ^
              9  13
      ---------- Buffer: foo ----------
 
 (In this case, the index returned is a buffer position; the first
 character of the buffer counts as 1.)