35.3.4 正则表达式函数

这些函数用于操作正则表达式。

Function: regexp-quote string

该函数返回一个正则表达式,其唯一精确匹配的内容是 string。 在 looking-at 中使用该正则表达式,仅当缓冲区中的下一个字符是 string 时才会匹配成功; 在搜索函数中使用时,只要被搜索的文本包含 string 就会匹配成功。See 正则表达式搜索

这允许你在调用需要正则表达式的函数时,执行精确的字符串匹配或搜索。

(regexp-quote "^The cat$")
     ⇒ "\\^The cat\\$"

regexp-quote 的一个用途是将精确字符串匹配与正则表达式描述的上下文结合。 例如,以下代码搜索由空白符包围的、值为 string 的字符串:

(re-search-forward
 (concat "\\s-" (regexp-quote string) "\\s-"))

如果返回的字符串不包含任何特殊字符,它可能就是 string 本身。

Function: regexp-opt strings &optional paren

该函数返回一个高效的正则表达式,能够匹配列表 strings 中的任意一个字符串。 当你需要让匹配或搜索尽可能快时(例如用于字体锁定模式28),这个函数非常有用。

如果 strings 是空列表,返回值是一个永远不会匹配任何内容的正则表达式。

可选参数 paren 可以是以下任意值:

item 字符串 生成的正则表达式前会添加 paren,后会添加 ‘\)’。 例如,使用 ‘"\\(?1:"’ 可以生成一个显式编号的组。

words

生成的正则表达式会被 ‘\<\(’ 和 ‘\)\>’ 包围。

symbols

生成的正则表达式会被 ‘\_<\(’ 和 ‘\)\_>’ 包围 (这通常适用于匹配编程语言关键字等场景)。

nil

生成的正则表达式会被 ‘\(’ 和 ‘\)’ 包围。

nil

如果需要确保附加到其后的后缀运算符作用于整个表达式, 生成的正则表达式会被 ‘\(?:’ 和 ‘\)’ 包围。

返回的正则表达式经过排序,始终会匹配最长的可能字符串。

除了顺序之外,regexp-opt 生成的正则表达式与简化版本等价,但通常更高效:

(defun simplified-regexp-opt (strings &optional paren)
 (let ((parens
        (cond
         ((stringp paren)       (cons paren "\\)"))
         ((eq paren 'words)    '("\\<\\(" . "\\)\\>"))
         ((eq paren 'symbols) '("\\_<\\(" . "\\)\\_>"))
         ((null paren)          '("\\(?:" . "\\)"))
         (t                       '("\\(" . "\\)")))))
   (concat (car parens)
           (mapconcat 'regexp-quote strings "\\|")
           (cdr parens))))
Function: regexp-opt-depth regexp

该函数返回 regexp 中分组构造(带括号的表达式)的总数。 不包含非捕获组(see 正则表达式中的反斜杠结构)。

Function: regexp-opt-charset chars

该函数返回一个正则表达式,匹配字符列表 chars 中的任意一个字符。

(regexp-opt-charset '(?a ?b ?c ?d ?e))
     ⇒ "[a-e]"
Variable: regexp-unmatchable

该变量包含一个保证不会匹配任何字符串的正则表达式。 它特别适合用作可能被设置为实际匹配模式的变量的默认值。


Footnotes

(28)

注意 regexp-opt 并不保证其结果是绝对最高效的形式。手动优化的正则表达式有时可能略微高效,但几乎不值得为此花费精力。