35.3.4 Функции регулярных выражений

Эти функции работают с регулярными выражениями.

Функция: regexp-quote string

Эта функция возвращает регулярное выражение, единственным точным совпадением которого является string. Использование этого регулярного выражения в looking-at сработает только в том случае, если следующие символы в буфере — это string; использование его в функции поиска сработает, если искомый текст содержит string. См. Поиск с помощью регулярных выражений.

Это позволяет запросить точное совпадение строки или поиск при вызове функции, которая ожидает регулярное выражение.

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

Одно из применений regexp-quote — объединение точного совпадения строки с контекстом, описанным как регулярное выражение. Например, это ищет строку, являющуюся значением string, окруженную пробелами:

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

Возвращаемая строка может быть самой string, если она не содержит специальных символов.

Функция: regexp-opt strings &optional paren

Эта функция возвращает эффективное регулярное выражение, которое совпадет с любым из строк в списке strings. Это полезно, когда вам необходимо сделать сопоставление или поиск максимально быстрым — например, для режима Font Lock28.

Если strings — пустой список, возвращаемое значение — это регулярное выражение, которое никогда ни с чем не совпадет.

Необязательный аргумент paren может быть одним из следующих:

строка

Результатное регулярное выражение предшествует paren и следует за апострофом ')'. Например, используйте "\\(?1:" для получения явно пронумерованной группы.

words

Результатное регулярное выражение окружено <(\ и )\>.

symbols

Результатное регулярное выражение окружено \_<(\ и )\_> (это часто уместно при сопоставлении ключевых слов языка программирования и т.п.).

non-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))))
Функция: regexp-opt-depth regexp

Эта функция возвращает общее количество группирующих конструкций (скобочные выражения) в regexp. Это не включает слабые группы (см. Конструкции с обратным слэшем в регулярных выражениях).

Функция: regexp-opt-charset chars

Эта функция возвращает регулярное выражение, соответствующее символу из списка символов chars.

(regexp-opt-charset '(?a ?b ?c ?d ?e))
     ⇒ "[a-e]"
Переменная: regexp-unmatchable

Эта переменная содержит регулярное выражение, которое гарантированно не совпадет ни с какой строкой. Она особенно полезна в качестве значения по умолчанию для переменных, которые могут быть установлены на шаблон, который на самом деле что-то совпадает.


Примечания

(28)

Обратите внимание, что regexp-opt не гарантирует, что его результат является абсолютно самой эффективной формой. Ручное настраиваемое регулярное выражение иногда может быть немного эффективнее, но почти никогда не стоит усилий.