В GNU Emacs вы можете искать следующее совпадение с регулярным выражением (см. Синтаксис регулярных выражений) как инкрементально, так и нет. О командах инкрементального поиска см. Поиск по регулярному выражению в Руководстве по GNU Emacs. Здесь мы описываем только функции поиска, полезные в программах. Основной из них является re-search-forward.
Эти функции поиска преобразуют регулярное выражение в многобайтовое, если буфер многобайтовый; они преобразуют регулярное выражение в однобайтовое, если буфер однобайтовый. См. Текстовые представления.
Эта функция выполняет поиск вперёд в текущем буфере строки текста, которая соответствует регулярному выражению 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’. Вычисление вызова поиска перемещает точку в конец этой строки (между ‘t’ в ‘hat’ и символом новой строки).
---------- Буфер: foo ---------- I read "∗The cat in the hat comes back" twice. ---------- Буфер: foo ----------
(re-search-forward "[a-z]+" nil t 5)
⇒ 27
---------- Буфер: foo ----------
I read "The cat in the hat∗
comes back" twice.
---------- Буфер: 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). См. Данные о совпадении. Если inhibit-modify не равен nil, данные о совпадении не изменяются.
(string-match
"quick" "The quick brown fox jumped quickly." 8)
⇒ 27
(match-end 0)
⇒ 32
Эта предикатная функция делает то же, что и string-match, но избегает изменения данных о совпадении.
Эта функция определяет, соответствует ли текст в текущем буфере непосредственно после точки регулярному выражению regexp. «Непосредственно после» означает именно это: поиск является «привязанным» и может успешно завершиться, только начиная с первого символа после точки. Результат — t, если да, и nil в противном случае.
Эта функция не перемещает точку, но обновляет данные о совпадении (если inhibit-modify равен nil или отсутствует, что является значением по умолчанию). См. Данные о совпадении. Для удобства вместо аргумента inhibit-modify вы можете использовать looking-at-p, описанную ниже.
В этом примере точка расположена непосредственно перед ‘T’. Если бы она была где-то ещё, результатом было бы nil.
---------- Буфер: foo ----------
I read "∗The cat in the hat
comes back" twice.
---------- Буфер: foo ----------
(looking-at "The cat in the hat$")
⇒ t
Эта функция возвращает t, если regexp соответствует тексту непосредственно перед точкой (т.е. заканчивающемуся в точке), и nil в противном случае.
Поскольку сопоставление с регулярным выражением работает только в прямом направлении, это реализовано путём поиска назад от точки для совпадения, которое заканчивается в точке. Это может быть довольно медленно, если нужно искать на большое расстояние. Вы можете ограничить необходимое время, указав ненулевое значение limit, которое говорит не искать перед limit. В этом случае найденное совпадение должно начинаться на или после limit. Вот пример:
---------- Буфер: foo ----------
I read "∗The cat in the hat
comes back" twice.
---------- Буфер: 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, на который влияет привязка, выполняет поиски, регулярное выражение для которых было получено из интерактивного пользовательского ввода. Другими словами, эта переменная должна использоваться только для того, чтобы сообщить примитивам поиска по регулярным выражениям, как интерпретировать пробелы, введённые пользователем.