Spec-Zone.ru › Elisp

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

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

‘\|’

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

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

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

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

‘\{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.

‘\cc’

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

‘\Cc’

соответствует любому символу, категория которого не равна c.

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

‘\`’

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

‘\'’

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

‘\=’

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

‘\b’

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

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

‘\B’

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

‘\<’

соответствует пустой строке, но только в начале слова. ‘\<’ соответствует началу буфера (или строки) только в том случае, если за ним следует символ слова.

‘\>’

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

‘\_<’

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

‘\_>’

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

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

Copyright © 1990-1996, 1998-2022 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