Конструкции с обратной косой чертой в регулярных выражениях
В большинстве случаев «\», за которым следует любой символ, совпадает только с этим символом. Однако есть несколько исключений: некоторые последовательности, начинающиеся с «\», имеют особое значение. Ниже приведена таблица специальных конструкций с «\».
- «\|»
-
задаёт альтернативу. Два регулярных выражения 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,\}» эквивалентно «+».
- «\( … \)»
-
является конструкцией группировки, выполняющей три задачи:
- Объединяет набор альтернатив «\|» для применения к ним других операций. Так, регулярное выражение «\(foo\|bar\)x» совпадает либо с «foox», либо с «barx».
- Объединяет сложное выражение, к которому применяются постфиксные операторы «*», «+» и «?». Так, «ba\(na\)*» совпадает с «ba», «bana», «banana», «bananana» и т. д., то есть с любым количеством (от нуля и более) строк «na».
- Сохраняет совпавшую подстроку для последующей ссылки на неё с помощью «\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