在 GNU Emacs 中,你可以通过增量或非增量方式搜索正则表达式的下一个匹配项(see 正则表达式语法)。
增量搜索命令详见 Regular Expression Search in The GNU Emacs Manual。
本节仅描述程序中常用的搜索函数,核心函数是 re-search-forward。
如果缓冲区是多字节编码,这些搜索函数会将正则表达式转换为多字节; 如果缓冲区是单字节编码,则转换为单字节。See 文本表示方式。
该函数在当前缓冲区中向前搜索能被正则表达式 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 ----------
该函数在当前缓冲区中向后搜索能被正则表达式 regexp 匹配的文本字符串, 并将光标定位到第一个找到的文本的开头。
该函数与 re-search-forward 类似,但并非简单的镜像。
re-search-forward 寻找开头最接近起点的匹配项。
如果 re-search-backward 是完美镜像,它会寻找结尾最接近起点的匹配项。
但实际上,它寻找的是开头最接近起点(且结尾在起点之前)的匹配项。
原因是:在指定位置匹配正则表达式始终从开头到结尾进行,并从指定的起始位置开始。
真正的 re-search-forward 镜像需要支持从结尾到开头匹配正则表达式的特殊功能,
实现该功能并不值得。
该函数返回正则表达式 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
该判断函数的功能与 string-match 相同,
但不会修改匹配数据。
该函数判断当前缓冲区中光标紧后方的文本是否匹配正则表达式 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
如果 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 函数。
该判断函数的功能与 looking-at 相同,
但不会更新匹配数据。
如果该变量非 nil,它必须是一个正则表达式,用于指定如何搜索空白符。
这种情况下,被搜索的正则表达式中的任意一组空格都代表使用该正则表达式。
但是,‘[…]’、‘*’、‘+’、‘?’ 等构造内部的空格不受 search-spaces-regexp 影响。
由于该变量影响所有正则表达式搜索和匹配构造, 你应该在尽可能小的代码片段中临时绑定它, 并且仅当受绑定影响的 Lisp 代码执行的搜索其正则表达式来自交互式用户输入时使用。 换句话说,该变量仅用于告诉正则表达式搜索原语如何解释用户输入的空白符。