35.6.2 简单匹配数据访问

本节说明如何使用匹配数据,获取最近一次成功的搜索或匹配操作的结果。

你可以查询整个匹配文本,或正则表达式中某个特定括号分组的内容。下方函数中的 count 参数用于指定目标:count 为 0 时代表整个匹配结果;为正数时代表对应序号的子表达式。

正则表达式的子表达式是指由转义括号 ‘\(…\)’ 包裹的分组。第 count 个子表达式按整个正则表达式开头的 ‘\(’ 出现顺序计数,第一个子表达式编号为 1,第二个为 2,依此类推。只有正则表达式搜索会产生子表达式;普通字符串搜索后,仅能获取整个匹配的信息。

每次成功的搜索都会重置匹配数据。因此,你应在搜索后立即查询匹配数据,避免调用其他可能执行搜索的函数。你也可以在可能触发搜索的函数调用前后保存并恢复匹配数据(see 保存与恢复匹配数据),或使用明确不会修改匹配数据的函数,例如 string-match-p

失败的搜索可能修改也可能不修改匹配数据。当前实现中不会修改,但未来可能变更。不要依赖失败搜索后的匹配数据值。

Function: match-string count &optional in-string

该函数以字符串形式返回最近一次搜索或匹配操作的结果。count 为 0 时返回整个匹配文本;为正数时返回第 count 个括号子表达式对应的部分。

如果最近一次操作是使用 string-match 对字符串执行的,应将同一字符串作为 in-string 传入。在缓冲区搜索或匹配后,应省略 in-string 或传入 nil,并确保调用 match-string 时的当前缓冲区就是执行搜索的缓冲区。不遵守此规则会导致结果错误。

count 超出范围,或对应子表达式位于未使用的 ‘\|’ 分支、重复次数为 0,则返回 nil

Function: match-string-no-properties count &optional in-string

该函数与 match-string 类似,但返回结果不包含任何文本属性。

Function: match-beginning count

若最近一次正则表达式搜索匹配成功,该函数返回匹配文本或其子表达式的起始位置。

count 为 0 时返回整个匹配的起始位置;否则指定正则表达式中的子表达式,返回该子表达式匹配的起始位置。

若对应子表达式位于未使用的 ‘\|’ 分支、重复次数为 0,则返回 nil

Function: match-end count

该函数与 match-beginning 类似,但返回匹配的结束位置而非起始位置。

以下是使用匹配数据的示例,注释中标注了文本内的位置:

(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)       ; 与 ‘qu’ 匹配的起始位置
     ⇒ 4                 ;   索引为 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.

另一个示例:光标初始位于行首,搜索后光标移动到空格与单词 ‘in’ 之间。整个匹配的起始位置在缓冲区第 9 个字符(‘T’),第一个子表达式的匹配起始位置在第 13 个字符(‘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 ----------

(本例中返回的索引为缓冲区位置,缓冲区第一个字符计为 1。)