本节说明如何使用匹配数据,获取最近一次成功的搜索或匹配操作的结果。
你可以查询整个匹配文本,或正则表达式中某个特定括号分组的内容。下方函数中的 count 参数用于指定目标:count 为 0 时代表整个匹配结果;为正数时代表对应序号的子表达式。
正则表达式的子表达式是指由转义括号 ‘\(…\)’ 包裹的分组。第 count 个子表达式按整个正则表达式开头的 ‘\(’ 出现顺序计数,第一个子表达式编号为 1,第二个为 2,依此类推。只有正则表达式搜索会产生子表达式;普通字符串搜索后,仅能获取整个匹配的信息。
每次成功的搜索都会重置匹配数据。因此,你应在搜索后立即查询匹配数据,避免调用其他可能执行搜索的函数。你也可以在可能触发搜索的函数调用前后保存并恢复匹配数据(see 保存与恢复匹配数据),或使用明确不会修改匹配数据的函数,例如 string-match-p。
失败的搜索可能修改也可能不修改匹配数据。当前实现中不会修改,但未来可能变更。不要依赖失败搜索后的匹配数据值。
该函数以字符串形式返回最近一次搜索或匹配操作的结果。count 为 0 时返回整个匹配文本;为正数时返回第 count 个括号子表达式对应的部分。
如果最近一次操作是使用 string-match 对字符串执行的,应将同一字符串作为 in-string 传入。在缓冲区搜索或匹配后,应省略 in-string 或传入 nil,并确保调用 match-string 时的当前缓冲区就是执行搜索的缓冲区。不遵守此规则会导致结果错误。
若 count 超出范围,或对应子表达式位于未使用的 ‘\|’ 分支、重复次数为 0,则返回 nil。
该函数与 match-string 类似,但返回结果不包含任何文本属性。
若最近一次正则表达式搜索匹配成功,该函数返回匹配文本或其子表达式的起始位置。
count 为 0 时返回整个匹配的起始位置;否则指定正则表达式中的子表达式,返回该子表达式匹配的起始位置。
若对应子表达式位于未使用的 ‘\|’ 分支、重复次数为 0,则返回 nil。
该函数与 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。)