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

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

‘\|’

задаёт альтернативу. Два регулярных выражения 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.