Spec-Zone.ru › Elisp

Конструкции с обратной косой чертой в регулярных выражениях

В большинстве случаев «\», за которым следует любой символ, совпадает только с этим символом. Однако есть несколько исключений: некоторые последовательности, начинающиеся с «\», имеют особое значение. Ниже приведена таблица специальных конструкций с «\».

«\|»

задаёт альтернативу. Два регулярных выражения a и b, разделённые «\|», образуют выражение, которое совпадает со всем, с чем совпадает либо a, либо b.

Таким образом, «foo\|bar» совпадает либо с «foo», либо с «bar», но ни с какой другой строкой.

«\|» распространяется на максимально возможные окружающие выражения. Ограничить область действия «\|» может только окружающая группировка «\( … \)».

Если для обработки нескольких применений «\|» вам требуется возможность полного возврата, используйте функции регулярных выражений POSIX (см. Emacs и регулярные выражения POSIX).

«\{m\}»

является постфиксным оператором, который повторяет предыдущий шаблон ровно m раз. Так, «x\{5\}» совпадает со строкой «xxxxx» и ни с чем другим. «c[ad]\{3\}r» совпадает с такими строками, как «caaar», «cdddr», «cadar» и так далее.

«\{m,n\}»

является более общим постфиксным оператором, задающим повторение от m до n раз. Если m опущено, минимальное число повторений равно 0; если опущено n, максимальное число не ограничено. В обеих формах значения m и n, если они заданы, не могут быть больше 2**16 − 1 .

Например, «c[ad]\{1,2\}r» совпадает со строками «car», «cdr», «caar», «cadr», «cdar» и «cddr», и ни с чем другим. «\{0,1\}» или «\{,1\}» эквивалентно «?». «\{0,\}» или «\{,\}» эквивалентно «*». «\{1,\}» эквивалентно «+».

«\( … \)»

является конструкцией группировки, выполняющей три задачи:

  1. Объединяет набор альтернатив «\|» для применения к ним других операций. Так, регулярное выражение «\(foo\|bar\)x» совпадает либо с «foox», либо с «barx».
  2. Объединяет сложное выражение, к которому применяются постфиксные операторы «*», «+» и «?». Так, «ba\(na\)*» совпадает с «ba», «bana», «banana», «bananana» и т. д., то есть с любым количеством (от нуля и более) строк «na».
  3. Сохраняет совпавшую подстроку для последующей ссылки на неё с помощью «\digit» (см. ниже).

Последнее применение не является следствием идеи группировки в скобках; это отдельная возможность, получившаяся в качестве второго значения той же конструкции «\( … \)», поскольку на практике между этими двумя значениями обычно не возникало конфликта. Однако иногда конфликт всё же возникал, что и привело к появлению незахватывающих групп.

«\(?: … \)»

является конструкцией незахватывающей группы. Незахватывающая группа выполняет первые две задачи обычной группы (управляет вложенностью других операторов), но ей не присваивается номер, поэтому нельзя сослаться на её значение с помощью «\digit». Незахватывающие группы особенно полезны для регулярных выражений, созданных автоматически, поскольку их можно добавлять без изменения нумерации обычных групп.

Незахватывающие группы также называются не захватывающими подстроку или ненумеруемыми группами.

«\(?num: … \)»

является конструкцией группы с явно заданным номером. Номера обычных групп задаются неявно, в зависимости от их положения, что может быть неудобно. Эта конструкция позволяет принудительно задать номер группы. Особых ограничений на нумерацию нет: например, можно создать несколько групп с одним и тем же номером — в этом случае сработает последняя совпавшая группа (то есть самая правая). Неявно нумеруемые группы всегда получают наименьшее целое число, превышающее номер любой предыдущей группы.

«\digit»

совпадает с тем же текстом, что и digit-е вхождение конструкции группировки («\( … \)»).

Иными словами, после завершения группы механизм поиска запоминает начало и конец текста, совпавшего с этой группой. Позже в регулярном выражении можно использовать «\», за которым следует digit, чтобы найти тот же текст, каким бы он ни был.

Строкам, совпавшим с первыми девятью конструкциями группировки во всём регулярном выражении, переданном функции поиска или сопоставления, присваиваются номера от 1 до 9 в порядке появления открывающих скобок в регулярном выражении. Поэтому для ссылки на текст, совпавший с соответствующими конструкциями группировки, можно использовать «\1» — «\9».

Например, «\(.*\)\1» совпадает с любой строкой без символов новой строки, состоящей из двух одинаковых половин. Конструкция «\(.*\)» совпадает с первой половиной, которая может быть любой, но следующая за ней «\1» должна совпасть в точности с тем же текстом.

Если конструкция «\( … \)» совпадает более одного раза (что может произойти, например, если за ней следует «*»), сохраняется только последнее совпадение.

Если определённая конструкция группировки в регулярном выражении ни разу не совпала — например, если она находится внутри неиспользованной альтернативы или внутри повторения, которое не выполнилось ни разу, — соответствующая конструкция «\digit» никогда ни с чем не совпадёт. Например, «\(foo\(b*\)\|lose\)\2» не может совпасть с «lose»: вторая альтернатива внутри внешней группы совпадает с этой строкой, но тогда «\2» не определена и не может ни с чем совпасть. Однако это выражение может совпасть с «foobb», поскольку первая альтернатива совпадает с «foob», а «\2» совпадает с «b».

«\w»

совпадает с любым символом, составляющим слово. Какие символы относятся к этой категории, определяется таблицей синтаксиса редактора. См. Таблицы синтаксиса.

«\W»

совпадает с любым символом, не составляющим слово.

«\scode»

совпадает с любым символом, синтаксис которого соответствует code. Здесь code — символ, обозначающий код синтаксиса: например, «w» означает символ, составляющий слово, «-» — пробельный символ, «(» — открывающую скобку и т. д. Для обозначения пробельного синтаксиса используйте «-» или символ пробела. Список кодов синтаксиса и обозначающих их символов см. в Таблице классов синтаксиса.

«\Scode»

совпадает с любым символом, синтаксис которого не соответствует code.

«\ccode»

совпадает с любым символом, категория которого соответствует code. Здесь code — символ, обозначающий категорию: например, в стандартной таблице категорий «c» обозначает китайские символы, а «g» — греческие. Список всех текущих определённых категорий можно посмотреть с помощью команды M-x describe-categories RET. Кроме стандартных категорий можно определять собственные с помощью функции define-category (см. Категории).

«\Ccode»

совпадает с любым символом, категория которого не соответствует code.

Следующие конструкции регулярных выражений совпадают с пустой строкой — то есть не потребляют символов, — однако возможность совпадения зависит от контекста. Во всех случаях начало и конец доступной части буфера рассматриваются так, как если бы это были фактические начало и конец буфера.

«\`»

совпадает с пустой строкой, но только в начале буфера или проверяемой строки.

«\'»

совпадает с пустой строкой, но только в конце буфера или проверяемой строки.

«\=»

совпадает с пустой строкой, но только в точке. (Эта конструкция не определена при поиске в строке.)

«\b»

совпадает с пустой строкой, но только в начале или конце слова. Таким образом, «\bfoo\b» совпадает с каждым вхождением «foo» в качестве отдельного слова. «\bballs?\b» совпадает с «ball» или «balls» в качестве отдельного слова.

«\b» совпадает в начале или конце буфера (или строки) независимо от того, какой текст находится рядом.

«\B»

совпадает с пустой строкой, но не в начале или конце слова, а также не в начале или конце буфера (или строки).

«\<»

совпадает с пустой строкой, но только в начале слова. «\<» совпадает в начале буфера (или строки) только в том случае, если за ним следует символ, составляющий слово.

«\>»

совпадает с пустой строкой, но только в конце слова. «\>» совпадает в конце буфера (или строки) только в том случае, если содержимое заканчивается символом, составляющим слово.

«\_<»

совпадает с пустой строкой, но только в начале символа. Символ — это последовательность из одного или нескольких символов, составляющих слово или символ. «\_<» совпадает в начале буфера (или строки) только в том случае, если за ним следует символ, составляющий символ.

«\_>»

совпадает с пустой строкой, но только в конце символа. «\_>» совпадает в конце буфера (или строки) только в том случае, если содержимое заканчивается символом, составляющим символ.

Не каждая строка является допустимым регулярным выражением. Например, строка, заканчивающаяся внутри выражения в квадратных скобках без закрывающего символа «]», недопустима; недопустима и строка, заканчивающаяся одиночным символом «\». Если какой-либо функции поиска передано недопустимое регулярное выражение, сигнализируется ошибка invalid-regexp.

Copyright © 1990-1996, 1998-2026 Free Software Foundation, Inc.
Licensed under the GNU GPL license.
https://www.gnu.org/software/emacs/manual/html_node/elisp/Regexp-Backslash.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API