Next: 正则表达式的最长匹配搜索, Previous: 正则表达式, Up: 搜索与匹配   [Contents][Index]


35.4 正则表达式搜索 ¶

在 GNU Emacs 中,你可以通过增量或非增量方式搜索正则表达式的下一个匹配项(see 正则表达式语法)。 增量搜索命令详见 Regular Expression Search in The GNU Emacs Manual。 本节仅描述程序中常用的搜索函数,核心函数是 re-search-forward。

如果缓冲区是多字节编码,这些搜索函数会将正则表达式转换为多字节; 如果缓冲区是单字节编码,则转换为单字节。See 文本表示方式。

Command: re-search-forward regexp &optional limit noerror count ¶

该函数在当前缓冲区中向前搜索能被正则表达式 regexp 匹配的文本字符串。 函数会跳过所有不匹配 regexp 的文本, 并将光标定位到第一个匹配项的末尾。 返回光标新位置。

如果 limit 非 nil,它必须是当前缓冲区中的一个位置, 指定搜索的上界。不会接受超出该位置的匹配。 如果 limit 省略或为 nil,默认使用缓冲区可访问部分的末尾。

搜索失败时,re-search-forward 的行为取决于 noerror 的值:

nil

抛出 search-failed 错误。

t

不执行任何操作,返回 nil。

其他值

将光标移动到 limit(或缓冲区可访问部分的末尾),返回 nil。

参数 noerror 仅影响未找到匹配项的有效搜索。 无论 noerror 为何值,无效参数都会引发错误。

如果 count 是正数 n,搜索会执行 n 次; 每次连续搜索都从上一次匹配的末尾开始。 如果所有连续搜索都成功,函数调用成功,移动光标并返回新位置。 否则函数调用失败,结果取决于上述 noerror 的值。 如果 count 是负数 −n,则向相反(向后)方向执行 n 次搜索。

以下示例中,光标初始位于 ‘T’ 之前。 执行搜索调用后,光标移动到该行末尾(‘hat’ 的 ‘t’ 与换行符之间)。

---------- Buffer: foo ----------
I read "∗The cat in the hat
comes back" twice.
---------- Buffer: foo ----------

(re-search-forward "[a-z]+" nil t 5)
     ⇒ 27

---------- Buffer: foo ----------
I read "The cat in the hat∗
comes back" twice.
---------- Buffer: foo ----------
Command: re-search-backward regexp &optional limit noerror count ¶

该函数在当前缓冲区中向后搜索能被正则表达式 regexp 匹配的文本字符串, 并将光标定位到第一个找到的文本的开头。

该函数与 re-search-forward 类似,但并非简单的镜像。 re-search-forward 寻找开头最接近起点的匹配项。 如果 re-search-backward 是完美镜像,它会寻找结尾最接近起点的匹配项。 但实际上,它寻找的是开头最接近起点(且结尾在起点之前)的匹配项。 原因是:在指定位置匹配正则表达式始终从开头到结尾进行,并从指定的起始位置开始。

真正的 re-search-forward 镜像需要支持从结尾到开头匹配正则表达式的特殊功能, 实现该功能并不值得。

Function: string-match regexp string &optional start inhibit-modify ¶

该函数返回正则表达式 regexp 在 string 中第一个匹配项的起始索引, 无匹配则返回 nil。 如果 start 非 nil,搜索从 string 的该索引位置开始。

例如:

(string-match
 "quick" "The quick brown fox jumped quickly.")
     ⇒ 4
(string-match
 "quick" "The quick brown fox jumped quickly." 8)
     ⇒ 27

字符串第一个字符的索引是 0,第二个字符的索引是 1,依此类推。

默认情况下,如果该函数找到匹配项,匹配项之后第一个字符的索引可以通过 (match-end 0) 获取。 See 匹配数据。 如果 inhibit-modify 非 nil,则不会修改匹配数据。

(string-match
 "quick" "The quick brown fox jumped quickly." 8)
     ⇒ 27

(match-end 0)
     ⇒ 32
Function: string-match-p regexp string &optional start ¶

该判断函数的功能与 string-match 相同, 但不会修改匹配数据。

Function: looking-at regexp &optional inhibit-modify ¶

该函数判断当前缓冲区中光标紧后方的文本是否匹配正则表达式 regexp。 “紧后方(Directly following)” 的含义是:搜索是 “锚定(anchored)” 的,仅从光标后的第一个字符开始才能匹配成功。 匹配成功返回 t,否则返回 nil。

该函数不移动光标,但会更新匹配数据(默认情况下 inhibit-modify 为 nil 或省略)。 See 匹配数据。 为方便使用,你可以使用下文介绍的 looking-at-p,替代 inhibit-modify 参数。

以下示例中,光标正好位于 ‘T’ 之前。 如果在其他位置,结果会是 nil。

---------- Buffer: foo ----------
I read "∗The cat in the hat
comes back" twice.
---------- Buffer: foo ----------

(looking-at "The cat in the hat$")
     ⇒ t
Function: looking-back regexp limit &optional greedy ¶

如果 regexp 匹配光标紧前方的文本(即以光标为结尾),该函数返回 t,否则返回 nil。

由于正则表达式匹配仅支持向前进行,该函数通过从光标向后搜索以光标结尾的匹配项实现。 如果需要搜索很长的距离,速度会很慢。 你可以为 limit 指定非 nil 值来限制搜索时间,表示不搜索 limit 之前的内容。 这种情况下,找到的匹配项必须起始于或晚于 limit。示例:

---------- Buffer: foo ----------
I read "∗The cat in the hat
comes back" twice.
---------- Buffer: foo ----------

(looking-back "read \"" 3)
     ⇒ t
(looking-back "read \"" 4)
     ⇒ nil

如果 greedy 非 nil,该函数会尽可能向后扩展匹配, 直到前一个字符无法成为 regexp 匹配的一部分时停止。 匹配扩展时,其起始位置允许出现在 limit 之前。

一般建议:尽量避免使用 looking-back,因为它速度较慢。 因此,暂无计划添加 looking-back-p 函数。

Function: looking-at-p regexp ¶

该判断函数的功能与 looking-at 相同, 但不会更新匹配数据。

Variable: search-spaces-regexp ¶

如果该变量非 nil,它必须是一个正则表达式,用于指定如何搜索空白符。 这种情况下,被搜索的正则表达式中的任意一组空格都代表使用该正则表达式。 但是,‘[…]’、‘*’、‘+’、‘?’ 等构造内部的空格不受 search-spaces-regexp 影响。

由于该变量影响所有正则表达式搜索和匹配构造, 你应该在尽可能小的代码片段中临时绑定它, 并且仅当受绑定影响的 Lisp 代码执行的搜索其正则表达式来自交互式用户输入时使用。 换句话说,该变量仅用于告诉正则表达式搜索原语如何解释用户输入的空白符。


Next: 正则表达式的最长匹配搜索, Previous: 正则表达式, Up: 搜索与匹配   [Contents][Index]