35.3.3.1 Конструкции в регулярных выражениях rx

Различные формы в регулярных выражениях rx описаны ниже. Сокращение rx представляет любую форму rx. rx… означает ноль или более форм rx и, если не указано иное, соответствует этим формам последовательно, как если бы они были обёрнуты в подформу (seq …).

Все это допустимые аргументы для макроса rx. Все формы определяются своей описанной семантикой; соответствующие строковые регулярные выражения приводятся только для облегчения понимания. A, B, … обозначают (заключённые в соответствующие скобки) строковые подвыражения регулярных выражений.

Литералы

"some-string"

Соответствует строке ‘some-string’ буквально. В отличие от строковых регулярных выражений, здесь нет символов со специальным значением.

?C

Соответствует символу ‘C’ буквально.

Последовательность и альтернатива

(seq rx…)
(sequence rx…)
(: rx…)
(and rx…)

Соответствует rx в последовательности. Без аргументов выражение соответствует пустой строке.
Соответствующее строковое регулярное выражение: ‘AB…’ (подвыражения в последовательности).

(or rx…)
(| rx…)

Соответствует ровно одному из rx. Если все аргументы являются строками, символами или формами or с такими же ограничениями, всегда будет использоваться самое длинное возможное совпадение. В противном случае будет использоваться либо самое длинное совпадение, либо первое (в порядке слева направо). Без аргументов выражение не будет соответствовать ничему.
Соответствующее строковое регулярное выражение: ‘A\|B\|…’.

unmatchable

Отказывается от любого совпадения. Эквивалентно (or). См. regexp-unmatchable.

Повторение

Обычно формы повторения являются жадными, то есть они пытаются соответствовать как можно больше раз. Некоторые формы являются нежадными; они пытаются соответствовать как можно меньше раз (см. Нежадное повторение).

(zero-or-more rx…)
(0+ rx…)

Соответствует rx ноль или более раз. По умолчанию жадный.
Соответствующее строковое регулярное выражение: ‘A*’ (жадный), ‘A*?’ (нежадный)

(one-or-more rx…)
(1+ rx…)

Соответствует rx один или более раз. По умолчанию жадный.
Соответствующее строковое регулярное выражение: ‘A+’ (жадный), ‘A+?’ (нежадный)

(zero-or-one rx…)
(optional rx…)
(opt rx…)

Соответствует rx один раз или пустой строке. По умолчанию жадный.
Соответствующее строковое регулярное выражение: ‘A?’ (жадный), ‘A??’ (нежадный).

(* rx…)

Соответствует rx ноль или более раз. Жадный.
Соответствующее строковое регулярное выражение: ‘A*’

(+ rx…)

Соответствует rx один или более раз. Жадный.
Соответствующее строковое регулярное выражение: ‘A+’

(? rx…)

Соответствует rx один раз или пустой строке. Жадный.
Соответствующее строковое регулярное выражение: ‘A?’

(*? rx…)

Соответствует rx ноль или более раз. Нежадный.
Соответствующее строковое регулярное выражение: ‘A*?’

(+? rx…)

Соответствует rx один или более раз. Нежадный.
Соответствующее строковое регулярное выражение: ‘A+?’

(?? rx…)

Соответствует rx или пустой строке. Нежадный.
Соответствующее строковое регулярное выражение: ‘A??’

(= n rx…)
(repeat n rx)

Соответствует rx ровно n раз.
Соответствующее строковое регулярное выражение: ‘A\{n\}’

(>= n rx…)

Соответствует rx n или более раз. Жадный.
Соответствующее строковое регулярное выражение: ‘A\{n,\}’

(** n m rx…)
(repeat n m rx…)

Соответствует rx как минимум n, но не более m раз. Жадный.
Соответствующее строковое регулярное выражение: ‘A\{n,m\}’

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

(minimal-match rx)

Соответствует rx, при этом zero-or-more, 0+, one-or-more, 1+, zero-or-one, opt и optional используют нежадное соответствие.

(maximal-match rx)

Соответствует rx, при этом zero-or-more, 0+, one-or-more, 1+, zero-or-one, opt и optional используют жадное соответствие. Это значение по умолчанию.

Сопоставление с одиночными символами

(any set…)
(char set…)
(in set…)

Соответствует одиночному символу из одного из set. Каждый set — это символ, строка, представляющая множество своих символов, диапазон или класс символов (см. ниже). Диапазон — это либо строка, содержащая дефис, например "A-Z", либо cons ячеек из символов, например (?A . ?Z).

Обратите внимание, что дефис (-) является специальным символом в строках в этой конструкции, поскольку он действует как разделитель диапазона. Чтобы включить дефис, добавьте его как отдельный символ или строку из одного символа.
Соответствующее строковое регулярное выражение: ‘[…]’

(not charspec)

Соответствует символу, не входящему в charspec. charspec может быть символом, строкой из одного символа, формой any, not, or, intersection, syntax или category, или классом символов. Если charspec является формой or, её аргументы имеют те же ограничения, что и аргументы intersection; см. ниже.
Соответствующее строковое регулярное выражение: ‘[^…]’, ‘\Scode’, ‘\Ccode’

(intersection charset…)

Соответствует символу, входящему во все charset. Каждый charset может быть символом, строкой из одного символа, формой any без классов символов, или формой intersection, or или not, аргументы которой также являются charset.

not-newline, nonl

Соответствует любому символу, кроме символа новой строки.
Соответствующее строковое регулярное выражение: ‘.’ (точка)

anychar, anything

Соответствует любому символу.
Соответствующее строковое регулярное выражение: ‘.\|\n’ (например)

класс символов

Соответствует символу из именованного класса символов:

alpha, alphabetic, letter

Соответствует буквенным символам. Точнее, соответствует символам, свойство Unicode ‘general-category’ которых указывает, что они являются буквенными.

alnum, alphanumeric

Соответствует буквенным символам и цифрам. Точнее, соответствует символам, свойство Unicode ‘general-category’ которых указывает, что они являются буквенными или десятичными цифрами.

digit, numeric, num

Соответствует цифрам ‘0’–‘9’.

xdigit, hex-digit, hex

Соответствует шестнадцатеричным цифрам ‘0’–‘9’, ‘A’–‘F’ и ‘a’–‘f’.

cntrl, control

Соответствует любому символу, код которого находится в диапазоне 0–31.

blank

Соответствует горизонтальным пробельным символам. Точнее, соответствует символам, свойство Unicode ‘general-category’ которых указывает, что они являются разделителями пробелов.

space, whitespace, white

Соответствует любому символу, имеющему синтаксис пробела (см. Таблица классов синтаксиса).

lower, lower-case

Соответствует любым строчным буквам, согласно текущей таблице регистра. Если case-fold-search не равен nil, также соответствует любой заглавной букве.

upper, upper-case

Соответствует любым заглавным буквам, согласно текущей таблице регистра. Если case-fold-search не равен nil, также соответствует любой строчной букве.

graph, graphic

Соответствует любому символу, кроме пробелов, управляющих символов ASCII и не-ASCII, суррогатов и кодовых точек, не назначенных в Unicode, согласно свойству Unicode ‘general-category’.

print, printing

Соответствует пробелу или символу, соответствующему graph.

punct, punctuation

Соответствует любому знаку пунктуации. (В настоящее время для многобайтовых символов — всё, что имеет синтаксис не-слова.)

word, wordchar

Соответствует любому символу, имеющему синтаксис слова (см. Таблица классов синтаксиса).

ascii

Соответствует любому символу ASCII (коды 0–127).

nonascii

Соответствует любому не-ASCII символу (но не сырым байтам).

Классы space, word и punct используют синтаксическую таблицу текущего буфера, но не переопределяющие текстовые свойства синтаксиса (см. Свойства синтаксиса).
Соответствующее строковое регулярное выражение: ‘[[:class:]]’

(syntax syntax)

Соответствует символу с синтаксисом syntax, где syntax — одно из следующих имён:

Имя синтаксисаСимвол синтаксиса
whitespace-
punctuation.
wordw
symbol_
open-parenthesis(
close-parenthesis)
expression-prefix'
string-quote"
paired-delimiter$
escape\
character-quote/
comment-start<
comment-end>
string-delimiter|
comment-delimiter!

Подробнее см. Таблица классов синтаксиса. Обратите внимание, что (syntax punctuation) не эквивалентно классу символов punctuation.
Соответствующее строковое регулярное выражение: ‘\schar’, где char — это символ синтаксиса.

(category category)

Соответствует символу из категории category, которая задаётся либо одним из имён ниже, либо своим символом категории.

Имя категорииСимвол категории
space-for-indentпробел
base.
consonant0
base-vowel1
upper-diacritical-mark2
lower-diacritical-mark3
tone-mark4
symbol5
digit6
vowel-modifying-diacritical-mark7
vowel-sign8
semivowel-lower9
not-at-end-of-line<
not-at-beginning-of-line>
alpha-numeric-two-byteA
chinese-two-byteC
greek-two-byteG
japanese-hiragana-two-byteH
indian-two-byteI
japanese-katakana-two-byteK
strong-left-to-rightL
korean-hangul-two-byteN
strong-right-to-leftR
cyrillic-two-byteY
combining-diacritic^
asciia
arabicb
chinesec
ethiopice
greekg
koreanh
indiani
japanesej
japanese-katakanak
latinl
laoo
tibetanq
japanese-romanr
thait
vietnamesev
hebreww
cyrillicy
can-break|

Для получения дополнительной информации о текущих определённых категориях выполните команду M-x describe-categories RET. О том, как определять новые категории, см. Категории.
Соответствующее строковое регулярное выражение: ‘\cchar’, где char — это символ категории.

Утверждения нулевой ширины

Все они соответствуют пустой строке, но только в определённых местах.

line-start, bol

Соответствует началу строки.
Соответствующее строковое регулярное выражение: ‘^’

line-end, eol

Соответствует концу строки.
Соответствующее строковое регулярное выражение: ‘$’

string-start, bos, buffer-start, bot

Соответствует началу строки или буфера, с которым выполняется сопоставление.
Соответствующее строковое регулярное выражение: ‘\`’

string-end, eos, buffer-end, eot

Соответствует концу строки или буфера, с которым выполняется сопоставление.
Соответствующее строковое регулярное выражение: ‘\'’

point

Соответствует позиции точки.
Соответствующее строковое регулярное выражение: ‘\=’

word-start, bow

Соответствует началу слова.
Соответствующее строковое регулярное выражение: ‘\<’

word-end, eow

Соответствует концу слова.
Соответствующее строковое регулярное выражение: ‘\>’

word-boundary

Соответствует началу или концу слова.
Соответствующее строковое регулярное выражение: ‘\b’

not-word-boundary

Соответствует везде, кроме начала или конца слова.
Соответствующее строковое регулярное выражение: ‘\B’

symbol-start

Соответствует началу символа.
Соответствующее строковое регулярное выражение: ‘\_<’

symbol-end

Соответствует концу символа.
Соответствующее строковое регулярное выражение: ‘\_>’

Захватывающие группы

(group rx…)
(submatch rx…)

Соответствует rx, делая сопоставленный текст и позицию доступными в данных совпадения. Первая группа в регулярном выражении имеет номер 1; последующие группы будут нумероваться на единицу больше предыдущего наибольшего номера группы в шаблоне на данный момент.
Соответствующее строковое регулярное выражение: ‘\(…\)’

(group-n n rx…)
(submatch-n n rx…)

Как group, но явно присваивает группе номер n. n должен быть положительным.
Соответствующее строковое регулярное выражение: ‘\(?n:…\)’

(backref n)

Соответствует тексту, ранее сопоставленному группой с номером n. n должно быть в диапазоне 1–9.
Соответствующее строковое регулярное выражение: ‘\n’

Динамическое включение

(literal expr)

Соответствует буквальной строке, которая является результатом вычисления Lisp-выражения expr. Вычисление происходит во время вызова, в текущем лексическом окружении.

(regexp expr)
(regex expr)

Соответствует строковому регулярному выражению, являющемуся результатом вычисления Lisp-выражения expr. Вычисление происходит во время вызова, в текущем лексическом окружении.

(eval expr)

Соответствует форме rx, которая является результатом вычисления Lisp-выражения expr. Вычисление происходит во время макро-расширения для rx, во время вызова для rx-to-string, в текущем глобальном окружении.