Прочитать на английском

Поделиться через


Синтаксис регулярного выражения 2 (re2.h)

Регулярные выражения — это нотация для описания наборов строк символов. Если строка находится в наборе, описанном регулярным выражением, мы говорим, что регулярное выражение соответствует строке.

Самое простое регулярное выражение — это один буквенный символ. Кроме метасимволов, таких как *+?()|, символы соответствуют самим себе. Чтобы сопоставить метачару, экранируйте ее с обратной косой чертой. Например, \+ соответствует литералу плюс символа.

Два регулярных выражения могут быть изменены или сцеплены для формирования нового регулярного выражения: если e1 соответствует s и e2 соответствует t, то e1 | e2 соответствует s или t и e1e2 соответствует st.

Метасимракторы *, +и ? являются операторами повторения: e1* соответствует последовательности из нуля или нескольких (возможно, разных) строк, каждая из которых соответствует e1; e1+ соответствует одному или нескольким; e1? соответствует нулю или единице.

Приоритет операторов, от слабой до самой надежной привязки, выглядит следующим образом:

  • чередование
  • конкатенация
  • Операторы повторения

Явные скобки можно использовать для принудительного применения различных значений, как в арифметических выражениях. Некоторые примеры: ab|cd эквивалентно (ab)|(cd) ; ab\ эквивалентно a(b\).

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

На этой странице представлен синтаксис регулярных выражений, принятый в RE2.

В нем также перечислены некоторые синтаксисы, принятые PCRE, PERL и VIM.

Таблицы синтаксиса

Типы односимвольных выражений Примеры
любой символ, возможно, включающий новую строку (s=true) .
класс символов [xyz]
класс отрицательных символов [^xyz]
класс символов Perl (ссылка) \d
класс отрицательных символов Perl \D
класс символов ASCII (ссылка) [[:alpha:]]
класс отрицательных символов ASCII [[:^alpha:]]
класс символов Юникода (однобуквенное имя) \pN
класс символов Юникода \p{Greek}
класс отрицательных символов Юникода (однобуквенное имя) \PN
класс отрицательных символов Юникода \P{Greek}
  Составные части
xy x, за которым следует y
x|y x или y (предпочтительно x)
  Повторы
x* ноль или больше x; предпочтительно больше
x+ один или больше x; предпочтительно больше
x? ноль или один х, предпочтительно один
x{n,m} n или n+1, или ..., или m x, предпочтительно больше
x{n,} n или больше x; предпочтительно больше
x{n} точно n x
x*? ноль или больше x; предпочтительно меньше
x+? один или больше x; предпочтительно меньше
x?? ноль или один х, предпочтительно ноль
x{n,m}? n или n+1, или ..., или m x, предпочтительно меньше
x{n,}? n или больше x; предпочтительно меньше
x{n}? точно n x
x{} (≡ x*) (НЕ ПОДДЕРЖИВАЕТСЯ) ЭНЕРГИЯ
x{-} (≡ x*?) (НЕ ПОДДЕРЖИВАЕТСЯ) ЭНЕРГИЯ
x{-n} (≡ x{n}?) (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
x= (≡ x?) (НЕ ПОДДЕРЖИВАЕТСЯ) VIM

Ограничение реализации: формы подсчета x{n,m}, x{n,}и x{n} отклоняющие формы, которые создают минимальное или максимальное число повторений свыше 1000. Это ограничение не распространяется на неограниченное количество повторений.

  Жадные повторения
x*+ ноль или больше x, жадное (НЕ ПОДДЕРЖИВАЕТСЯ)
x++ один или больше x, жадное (НЕ ПОДДЕРЖИВАЕТСЯ)
x?+ ноль или один x, жадное (НЕ ПОДДЕРЖИВАЕТСЯ)
x{n,m}+ n или ..., или m x, жадное (НЕ ПОДДЕРЖИВАЕТСЯ)
x{n,}+ n или больше x, жадное (НЕ ПОДДЕРЖИВАЕТСЯ)
x{n}+ точно n x, жадное (НЕ ПОДДЕРЖИВАЕТСЯ)
  Группирование
(re) нумерованная группа захвата (частичное совпадение)
(?P<name>re) именованной & нумерованной группе записи (подсчет)
(?<name>re) с именем & нумерованной группой записи (подсочет) (НЕ ПОДДЕРЖИВАЕТСЯ)
(?' name're) с именем & нумерованной группой записи (подсочет) (НЕ ПОДДЕРЖИВАЕТСЯ)
(?:re) группа без захвата
(?flags) установка флагов в текущей группе; без захвата
(?flags:re) установка флагов при ответе; без захвата
(?#text) комментарий (НЕ ПОДДЕРЖИВАЕТСЯ)
(?|x|y|z) сброс нумерации ветви (НЕ ПОДДЕРЖИВАЕТСЯ)
(?>re) жадное сопоставление для re (НЕ ПОДДЕРЖИВАЕТСЯ)
re@> жадное сопоставление для re (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
%(re) группа без захвата (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
  Флажки
i без учета регистра (значение по умолчанию: false)
m многострочный режим: ^ и $ соответствуют началу и концу строки в дополнение к тексту начала и конца (значение по умолчанию: false)
s разрешение . соответствовать \n (значение по умолчанию: false)
U ungreedy: значение переключения x* и x*?, x+ и x+?, и т. д. (по умолчанию false)

Синтаксис флага: xyz (set) или -xyz (clear) или xy-z (set xy, clear z).

  Пустые строки
^ в начале текста или строки (m=true)
$ в конце текста (например, \z, а не \Z) или строки (m=true)
\A в начале текста
\b на границе слова ASCII (\w с одной стороны и \W, \A или \z — с другой)
\B не на границе слова ASCII
\g в начале искомого подчиненного текста (НЕ ПОДДЕРЖИВАЕТСЯ) PCRE
\G в конце последнего соответствия (НЕ ПОДДЕРЖИВАЕТСЯ) PERL
\Z в конце текста или перед новой строкой в конце текста (НЕ ПОДДЕРЖИВАЕТСЯ)
\z в конце текста
(?=re) перед текстом, соответствующим re (НЕ ПОДДЕРЖИВАЕТСЯ)
(?!re) перед текстом, не соответствующим re (НЕ ПОДДЕРЖИВАЕТСЯ)
(?<=re) после текста, соответствующего re (НЕ ПОДДЕРЖИВАЕТСЯ)
(?<!re) после текста, не соответствующего re (НЕ ПОДДЕРЖИВАЕТСЯ)
re& перед текстом, соответствующим re (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
re@= перед текстом, соответствующим re (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
re@! перед текстом, не соответствующим re (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
<re@= после текста, соответствующего re (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
re@<! после текста, не соответствующего re (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\zs задает начало соответствия (= \K) (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\ze задает конец соответствия (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\%^ начало файла (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\%$ конец файла (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\%V на экране (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\%# положение курсора (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\%'m положение метки m (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\%23l в строке 23 (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\%23c в столбце 23 (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\%23v в виртуальном столбце 23 (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
  Последовательности экранирования
\a колокольчик (≡ \007)
\f веб-канал формы (≡ \014)
\t горизонтальная табуляция (≡ \011)
\n новая строка (≡ \012)
\r возврат каретки (≡ \015)
\v символ вертикальной табуляции (≡ \013)
* литерал *, для любого знака препинания *
\123 восьмеричный код символа (до трех цифр)
\x7F шестнадцатеричный код символа (точно две цифры)
\x{10FFFF} шестнадцатеричный код символа
\C соответствие одного байта даже в режиме UTF-8
\Q...\E обычный текст ..., даже если ... содержит знаки препинания
\1 обратная ссылка (НЕ ПОДДЕРЖИВАЕТСЯ)
\b возврат на символ (НЕ ПОДДЕРЖИВАЕТСЯ) (используйте \010)
\cK управляющий символ ^K (НЕ ПОДДЕРЖИВАЕТСЯ) (используйте \001 и т. д.)
\e экранирование (НЕ ПОДДЕРЖИВАЕТСЯ) (используйте \033)
\g1 обратная ссылка (НЕ ПОДДЕРЖИВАЕТСЯ)
\g{1} обратная ссылка (НЕ ПОДДЕРЖИВАЕТСЯ)
\g{+1} обратная ссылка (НЕ ПОДДЕРЖИВАЕТСЯ)
\g{-1} обратная ссылка (НЕ ПОДДЕРЖИВАЕТСЯ)
\g{name} именованная обратная ссылка (НЕ ПОДДЕРЖИВАЕТСЯ)
\g<name> вызов подпрограммы (НЕ ПОДДЕРЖИВАЕТСЯ)
\g'name' вызов подпрограммы (НЕ ПОДДЕРЖИВАЕТСЯ)
\k<name> именованная обратная ссылка (НЕ ПОДДЕРЖИВАЕТСЯ)
\k'name' именованная обратная ссылка (НЕ ПОДДЕРЖИВАЕТСЯ)
\lX X в нижнем регистре (НЕ ПОДДЕРЖИВАЕТСЯ)
\ux x в верхнем регистре (НЕ ПОДДЕРЖИВАЕТСЯ)
\L...\E текст ... в нижнем регистре (НЕ ПОДДЕРЖИВАЕТСЯ)
\K сброс начала $0 (НЕ ПОДДЕРЖИВАЕТСЯ)
\N{name} именованный символ Юникода (НЕ ПОДДЕРЖИВАЕТСЯ)
\R разрыв строки (НЕ ПОДДЕРЖИВАЕТСЯ)
\U...\E текст ... в верхнем регистре (НЕ ПОДДЕРЖИВАЕТСЯ)
\X расширенная последовательность Юникода (НЕ ПОДДЕРЖИВАЕТСЯ)
%d123 десятичный символ 123 (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
%xFF шестнадцатеричный символ FF (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
%o123 восьмеричный символ 123 (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
%u1234 символ Юникода 0x1234 (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
%U12345678 символ Юникода 0x12345678 (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
  Элементы класса символов
x одиночный символ
A–Z диапазон символов (включительно)
\d класс символов Perl
[:foo:] класс foo символов ASCII
\p{Foo} класс Foo символов Юникода
\pF класс F символов Юникода (однобуквенное имя)
  Классы именованных символов как элементы класса символов
[\d] цифры (≡ \d)
[^\d] не цифры (≡ \D)
[\D] не цифры (≡ \D)
[^\D] не "не цифры" (≡ \d)
[[:name:]] именованный класс ASCII внутри класса символов (≡ [:name:])
[^[:name:]] именованный класс ASCII внутри класса отрицательных символов (≡ [:^name:])
[\p{Name}] именованное свойство Юникода внутри класса символов (≡ \p{Name})
[^\p{Name}] именованное свойство Юникода внутри класса отрицательных символов (≡ \P{Name})
классы символов Perl (только ASCII)
\d цифры (≡ [0-9])
\D не цифры (≡ [^0-9])
\s пробел (≡ [\t\n\f\r])
\S не пробел (≡ [^\t\n\f\r])
\w символы слов (≡ [0-9A-Za-z_])
\W не символы слов (≡ [^0-9A-Za-z_])
\h горизонтальный пробел (НЕ ПОДДЕРЖИВАЕТСЯ)
\H не горизонтальный пробел (НЕ ПОДДЕРЖИВАЕТСЯ)
\v вертикальный пробел (НЕ ПОДДЕРЖИВАЕТСЯ)
\V не вертикальный пробел (НЕ ПОДДЕРЖИВАЕТСЯ)
Классы символов ASCII
[[:alnum:]] буквенно-цифровой (≡ [0-9A-Za-z])
[[:alpha:]] буквенный (≡ [A-Za-z])
[[:ascii:]] ASCII (≡ [\x00-\x7F])
[[:blank:]] пустой (≡ [\t])
[[:cntrl:]] управляющий (≡ [\x00-\x1F\x7F])
[[:digit:]] цифры (≡ [0-9])
[[:graph:]] графический (≡ [!-~][A-Za-z0-9!&quot;#$%&amp;&#39;()\*+,\-./:;&lt;=&gt;?@[\\\]^_` {\|}~])
[[:lower:]] нижний регистр (≡ [a-z])
[[:print:]] печатный (≡ [-~] ≡ [[:graph:]])
[[:punct:]] знаки препинания (≡ [!-/:-@[-`{-~])
[[:space:]] пробел (≡ [\t\n\v\f\r])
[[:upper:]] верхний регистр (≡ [A-Z])
[[:word:]] символы слов (≡ [0-9A-Za-z_])
[[:xdigit:]] шестнадцатеричная цифра (≡ [0-9A-Fa-f])
  Имена классов символов Юникода — общая категория
C др.
Копия control
Cf format
CN неназначенные кодовые точки (НЕ ПОДДЕРЖИВАЕТСЯ)
Co закрытое использование
Cs суррогат
L буква
LC буквы в регистре (НЕ ПОДДЕРЖИВАЕТСЯ)
L& буквы в регистре (НЕ ПОДДЕРЖИВАЕТСЯ)
Ll строчные буквы
Lm буква модификатора
Lo другая буква
Lt заглавная буква
Lu прописная буква
M знак
Mc знак пробела
Me знак завершения
Mn непробельный знак
N number
Nd десятичное число
Nl буквенное число
Нет другое число
P знаки препинания
Pc знаки препинания соединителя
Pd знак тире
Pe закрывающий знак препинания
Pf последний знак препинания
Pi исходный знак препинания
Po другой знак препинания
Ps открывающий знак препинания
S symbol,
Sc символ денежной единицы
Sk символ модификатора
Sm математический символ
So другой символ
Z разделитель
Zl разделитель строки
Zp разделитель абзаца
Zs разделитель в виде пробела
Имена классов символов Юникода — письменность
Адлам
Ахом
Anatolian_Hieroglyphs
Арабский
Армянский
Авестийская
Балийская письменность
Бамум
Bassa_Vah
Батакское письмо
Бенгальский
Бхайксуки
Бопомофо
Брахми
Шрифт Брайля
Бугийское письмо
Бухид
Canadian_Aboriginal
Карийское письмо
Caucasian_Albanian
Чакма
Чамская письменность
Чероки
Хорезмская письменность
Общие
Коптское письмо
Клинопись
Кипрское письмо
Кириллица
Дезерет
Деванагарская письменность
Dives_Akuru
Догра
Дуплоянская скоропись
Egyptian_Hieroglyphs
Эльбасанское письмо
Элимаик
Эфиопское письмо
Грузинский
Глаголица
Готское письмо
Грантха
Греческий
Письменность гуджарати
Gunjala_Gondi
Письменность гурмукхи
Китайские иероглифы
Хангыль
Hanifi_Rohingya
Хануноо
Хатран
Иврит
Хирагана
Imperial_Aramaic
Наследование
Inscriptional_Pahlavi
Inscriptional_Parthian
Яванская письменность
Кайтхи
Письменность каннада
Катакана
Kayah_Li
Кхароштхи
Khitan_Small_Script
Кхмерский
Ходжки
Кхудавади
Лаосский
Цифры, используемые с латинским алфавитом
Письменность лепча
Письменность лимбу
Linear_A
Linear_B
Лису
Ликийская письменность
Лидийская письменность
Махаджани
Письменность макасар
Письменность малаялам
Мандейская письменность
Манихейская письменность
Марчен
Masaram_Gondi
Медефаидрин
Meetei_Mayek
Mende_Kikakui
Meroitic_Cursive
Meroitic_Hieroglyphs
Мяо
Моди
Монгольский
Мро
Мултани
Мьянма
Набатейское письмо
Нандинагари
New_Tai_Lue
Ранджана
Письменность нко
Нюй-шу
Nyiakeng_Puachue_Hmong
Огамическое письмо
Ol_Chiki
Old_Hungarian
Old_Italic
Old_North_Arabian
Old_Permic
Old_Persian
Old_Sogdian
Old_South_Arabian
Old_Turkic
Ория
Оседжи
Сомалийское письмо
Pahawh_Hmong
Пальмирское письмо
Pau_Cin_Hau
Phags_Pa
Финикийское письмо
Psalter_Pahlavi
Реджангская письменность
Руническое письмо
Самаритянское письмо
Письменность саураштра
Сарати
Алфавит Шоу
Сиддхаматрика
SignWriting
Сингальский
Согдийское письмо
Sora_Sompeng
Соёмбо
Сунданская письменность
Syloti_Nagri
Сирийский
Тагалог
Тагбанва
Tai_Le
Tai_Tham
Tai_Viet
Такри
Тамильский
Тангутское письмо
Письменность телугу
Тана
Тайский
Тибетская письменность
Тифинаг
Тирхута
Угаритское письмо
Письменность ваи
Ванчо
Warang_Citi
Езидский алфавит
Носу
Zanabazar_Square
  Классы символов Vim
\i символ идентификатора (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\I \i кроме цифр (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\k символ ключевого слова (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\K \k кроме цифр (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\f символ имени файла (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\F \f кроме цифр (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\p печатный символ (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\P \p кроме цифр (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\s символ пробела (≡ [\t]) (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\S непробельный символ (≡ [^ \t]) (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\d цифры (≡ [0-9]) VIM
\D не \d VIM
\x шестнадцатеричные цифры (≡ [0-9A-Fa-f]) (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\X не \x (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\o восьмеричные цифры (≡ [0-7]) (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\O не \o (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\w символ слова VIM
\W не \w VIM
\h символ основы слова (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\H не \h (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\a буквенный (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\A не \a (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\l нижний регистр (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\L не нижний регистр (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\u верхний регистр (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\U не верхний регистр (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
_x \x плюс новая строка, для любого x (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\c игнорирование регистра (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\C соответствие регистру (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\m магический (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\M немагический (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\v очень магический (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\V очень немагический (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
\Z игнорирование различий в символах объединения Юникода (НЕ ПОДДЕРЖИВАЕТСЯ) VIM
  Магический
(?{code}) произвольный код Perl (НЕ ПОДДЕРЖИВАЕТСЯ) PERL
(??{code}) отложенный произвольный код Perl (НЕ ПОДДЕРЖИВАЕТСЯ) PERL
(?n) рекурсивный вызов группы захвата regexp n (НЕ ПОДДЕРЖИВАЕТСЯ)
(?+n) рекурсивный вызов относительной группы +n (НЕ ПОДДЕРЖИВАЕТСЯ)
(?-n) рекурсивный вызов относительной группы -n (НЕ ПОДДЕРЖИВАЕТСЯ)
(?C) вызов PCRE (НЕ ПОДДЕРЖИВАЕТСЯ) PCRE
(?R) рекурсивный вызов всего выражения regexp (≡ (?0)) (НЕ ПОДДЕРЖИВАЕТСЯ)
(?&имя) рекурсивный вызов именованной группы (НЕ ПОДДЕРЖИВАЕТСЯ)
(?P=name) именованная обратная ссылка (НЕ ПОДДЕРЖИВАЕТСЯ)
(?P>name) рекурсивный вызов именованной группы (НЕ ПОДДЕРЖИВАЕТСЯ)
(? (cond)true|false) условная ветвь (НЕ ПОДДЕРЖИВАЕТСЯ)
(?(cond)true) условная ветвь (НЕ ПОДДЕРЖИВАЕТСЯ)
(*ACCEPT) преобразование выражений regexp по аналогии с Prolog (НЕ ПОДДЕРЖИВАЕТСЯ)
(*COMMIT) (НЕ ПОДДЕРЖИВАЕТСЯ)
(*F) (НЕ ПОДДЕРЖИВАЕТСЯ)
(*FAIL) (НЕ ПОДДЕРЖИВАЕТСЯ)
(*MARK) (НЕ ПОДДЕРЖИВАЕТСЯ)
(*PRUNE) (НЕ ПОДДЕРЖИВАЕТСЯ)
(*SKIP) (НЕ ПОДДЕРЖИВАЕТСЯ)
(*THEN) (НЕ ПОДДЕРЖИВАЕТСЯ)
(*ANY) настройка соглашения для новой строки (НЕ ПОДДЕРЖИВАЕТСЯ)
(*ANYCRLF) (НЕ ПОДДЕРЖИВАЕТСЯ)
(*CR) (НЕ ПОДДЕРЖИВАЕТСЯ)
(*CRLF) (НЕ ПОДДЕРЖИВАЕТСЯ)
(*LF) (НЕ ПОДДЕРЖИВАЕТСЯ)
(*BSR_ANYCRLF) настройка соглашения \R (НЕ ПОДДЕРЖИВАЕТСЯ) PCRE
(*BSR_UNICODE) (НЕ ПОДДЕРЖИВАЕТСЯ) PCRE

Лицензия на содержимое

Примечание

Некоторые части этой страницы представляют собой измененные материалы, созданные и предоставленные на сайте Chromium.org. Их использование регулируется условиями, описанными в лицензии Creative Commons Attribution 4.0 International License. Исходная страница Chromium находится здесь.

Creative Commons License
Эта работа предоставляется в рамках международной лицензии Creative Commons Attribution 4.0 International License.

См. также