Регулярное выражение

Литерал регулярного выражения представляет собой регулярное выражение, используемое для операций сопоставления и разбора над строками.

Регулярные выражения предваряются символом r и заключаются в одиночные кавычки: r'…​'. Используется синтаксис регулярных выражений Rust.

Для изучения регулярных выражений в VRL рекомендуется использовать редактор и тестер выражений Rustexp.

Обычные и специальные символы

Представление Описание Эквиваленты

a

Большинство символов представляют сами себя.

\x61

\u0061

\U00000061

\\

Специальные символы [ ] \ / ^ $ . | ? * + ( ) { } для представления самих себя должны быть экранированы.

\x5C

\x61

Шестнадцатеричный код символа ASCII из двух цифр.

a

\u0062

Шестнадцатеричный код символа Unicode из четырех цифр.

b

\U00000062

Шестнадцатеричный код символа Unicode из восьми цифр.

c

\x{00003A9} \u{000003A9} \U{3A9}

Любой шестнадцатеричный код, которому соответствует символ Unicode.

Ω

\t

Символ горизонтальной табуляции.

\x09

\n

Символ перевода строки

\x0A

\r

Символ возврата каретки.

\x0D

\v

Символ вертикальной табуляции.

\x0B

\a

Символ звукового сигнала.

\x07

\f

Символ смены страницы.

\x0C

Метасимволы и специальные символьные классы

Представление Описание и эквиваленты

.

Метасимвол, обозначающий любой символ, кроме символа перевода строки \n.

\p{Property}

Любой символ со свойством Unicode, указанным в фигурных скобках.

Список поддерживаемых свойств представлен в документации репозитория regex.

\P{Property}

Любой символ, не имеющий свойства Unicode, указанного в фигурных скобках.

\pX

Любой символ Unicode, относящийся к классу, обозначенному одной буквой:

  • L — буквенные символы: графемы всех письменностей;

  • M — диакритические символы;

  • N — цифры;

  • P — знаки препинания;

  • S — знаки валют, математические и иные обозначения;

  • Z — пробельные символы, разделители строк и абзацев;

  • C — управляющие символы, символы из областей для частного использования и нераспределенных областей.

Эквивалент: \p{Property}

\PX

Любой символ Unicode, не относящийся к классу, обозначенному одной буквой.

Эквивалент: \P{Property}

[[:ascii:]]

Любой символ ASCII. Эквивалент: [\x00-\x7F]

[[:print:]]

Любой символ ASCII, доступный для печати: любой символ, кроме управляющих.

Эквивалент: [ -~]

[[:graph:]]

Любой отображаемый символ ASCII: любой символ, кроме управляющих и пробельных.

Эквивалент: [!-~]

\w

Любой символ Unicode, входящий в состав слов:

  • буква или идеограмма любой письменности;

  • диакритический символ;

  • цифра;

  • знак пунктуации, соединяющий слова (например, _);

  • управляющий символ для лигатур.

Эквивалент:

[\p{Alphabetic}\p{M}\d\p{Pc}\p{Join_Control}]

\W

Любой символ Unicode, не входящий в состав слов.

Эквивалент: [^\w]

[[:word:]]

Любая буква базового латинского алфавита, цифра ASCII или подчеркивание.

Эквиваленты:

[0-9A-Za-z_]

(?-u:\w)

[\w&&\p{ascii}]

[[:alnum:]]

Любая буква базового латинского алфавита или цифра ASCII.

Эквивалент: [0-9A-Za-z]

[[:alpha:]]

Любая буква базового латинского алфавита.

Эквивалент: [A-Za-z]

[[:upper:]]

Любая прописная буква базового латинского алфавита.

Эквивалент: [A-Z]

[[:lower:]]

Любая строчная буква базового латинского алфавита.

Эквивалент: [a-z]

\d

Любая десятичная цифра Unicode.

Эквивалент: \p{Nd}

\D

Любой символ, кроме десятичных цифр Unicode.

Эквивалент: [^\d]

[[:digit:]]

Любая десятичная цифра ASCII.

Эквиваленты:

[0-9]

[\d&&\p{ascii}]

(?-u:\d)

[[:xdigit:]]

Любая шестнадцатеричная цифра.

Эквивалент: [0-9A-Fa-f]

[[:punct:]]

Любой знак препинания ASCII.

Эквивалент: +[!-/:@\\\[\]\{\}\(\)~]+`

\s

Любой пробельный символ, то есть символ со свойством Unicode Whitespace.

Эквивалент: \p{White_Space}

\S

Любой символ, кроме пробельных.

Эквивалент: \P{White_Space}

[[:space:]]

Любой пробельный символ ASCII.

Эквивалент: [\t\n\v\f\r ]

[[:blank:]]

Пробел или горизонтальная табуляция.

Эквивалент: [\t ]

[[:cntrl:]]

Любой управляющий символ ASCII.

Эквивалент: [\x00-\x1F\x7F]

Символьные классы и перечисление

Представление Описание Найденные совпадения

xy

Последовательность x и y.

xy

x|y

Перечисление: одна из последовательностей x или y, причем предпочтение отдается x.

x

[xyz]

Объединение: символы из указанных в квадратных скобках.

x, y, z

[^xyz]

Отрицание: все символы, кроме указанных в квадратных скобках.

Все символы, кроме x, y и z.

[a-z]

Диапазон: все символы между указанными.

Символы от a до z включительно.

[x[^xyz]]

Вложенный класс: все символы, указанные хотя бы в одном из классов.

Все символы, кроме y и z.

[a-y&&xyz]

Пересечение: символы, которые входят в оба класса.

x, y

[0-9—​4]

Разность: символы первого класса, которые не входят во второй класс. (Эквивалентно записи [0-9&&[^4]]).

Все десятичные цифры ASCII, кроме 4.

[a-g~~b-h]

Симметрическая разность: символы, которые входят лишь в один класс из указанных.

a, h

Приоритет в перечислениях

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

Пример применения приоритета

Используйте VRL-песочницу, чтобы проверить работу программы.
Исходный код
.res = parse_regex_all!("authentication", r'authentication|auth', numeric_groups: true)
Результат
[
  {
    "0": "authentication"
  }
]

Здесь функция с шаблоном r'authentication|auth' сначала пытается найти последовательность "authentication", и поскольку она полностью соответствует строке, именно это совпадение и будет возвращено. Однако, если изменить порядок вариантов, изменится и результат.

Исходный код
.res = parse_regex_all!("authentication", r'auth|authentication', numeric_groups: true)
Результат
[
  {
    "0": "auth"
  }
]

При таком порядке вариантов сначала будет найдено "auth". На этом поиск остановится и вернет "auth", несмотря на то, что более длинный вариант "authentication" также соответствует строке.

Порядок вычисления символьных классов

  1. Диапазоны: выражение r'[а-яё]' равнозначно выражению r'[[а-я]ё]' и выбирает все строчные буквы русского алфавита.

  2. Объединение: выражение r'[ab&&bc]' равнозначно выражению r'[[ab]&&[bc]]' и выбирает символы, которые входят в оба класса.

  3. Пересечение, разность, симметрическая разность: имеют одинаковый приоритет и вычисляются по порядку слева направо. Например, следующее выражение:

    r'[\pL--\p\{Greek}&&\p\{Uppercase}]'

    равнозначно такому выражению:

    r'[[\pL--\p\{Greek}]&&\p\{Uppercase}]'

    Эти выражения выбирают все буквенные символы в верхнем регистре, кроме греческих.

  4. Отрицание: выражение r'[^a-z&&[:xdigit:]]' равнозначно выражению r'[^[a-z&&[:xdigit:]]]'.

    Эти выражения выбирают все символы, кроме тех, которые одновременно являются шестнадцатеричными цифрами и строчными латинскими буквами.

Группировка

Группы в круглых скобках определяют области действия флагов, квантификаторов, и перечислений.

Регулярные выражения поддерживают захват групп, что позволяет извлекать части шаблона как строки. Именованные группы захвата позволяют связать результаты извлечения с ключами.

Представление Описание

(exp)

Нумерованная группа захвата.

(?P<name>exp)

Именованная группа захвата. Возможно обращение как по номеру, так и по ключу, указанному в угловых скобках. (Эквивалентно записи (?<name>exp).)

Имя может включать буквенные символы и цифры Unicode, а также символы .,_[] и начинаться с буквенного символа либо подчеркивания.

(?:exp)

Незахватываемая группа.

(?x)

Установка флага x внутри текущей группы.

(?-x)

Выключение флага x внутри текущей группы.

(?x-y:exp)

Установка флага x и выключение флага y внутри незахватываемой группы.

Примеры группировки

Пример извлечения даты

Рассмотрим следующую функцию:

Исходный код
.res = parse_regex!("2012-12-12", r'(?P<y>\d{4})-(?P<m>\d{2})-(?P<d>\d{2})')
Результат
{
  "res": {
    "d": "12",
    "m": "12",
    "y": "2012"
  }
}

Данная функция извлекает из строки с датой вида YYYY-MM-DD группы, содержащие год, месяц и число с ключами y, m и d соответственно.

Пример изменения формата даты

В следующем примере используется захват именованных групп, чтобы изменить формат даты.

Исходный код
replace_with("2022-01-05, 2023-08-25 и 2024-10-18", r'(?x)
  (?P<y>\d{4}) # Год из 4 цифр Unicode.
  -
  (?P<m>\d{2}) # Месяц из 2 цифр Unicode.
  -
  (?P<d>\d{2}) # День из 2 цифр Unicode.
') -> |match| {
    to_string(match.d) + "/" + to_string(match.m) + "/" + to_string(match.y)
}
Результат
"05/01/2022, 25/08/2023 и 18/10/2024"

Квантификаторы

Квантификатор после символа, символьного класса или группы определяет, сколько раз может встречаться предшествующее выражение.

При жадной квантификации возвращается наиболее длинная строка из возможных соответствий, при ленивой — наиболее короткая.

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

x?

Ноль или одно повторение x.

Жадная квантификация

x*

Ноль или больше повторений x.

Жадная квантификация

x+

Одно или больше повторений x.

Жадная квантификация

x??

Ноль или одно повторение x.

Ленивая квантификация

x*?

Ноль или больше повторений x.

Ленивая квантификация

x+?

Одно или больше повторений x.

Ленивая квантификация

x{n}

В точности n повторений x. Аналогично записи x{n}?.

Поведение не зависит от режима квантификации

x{n,}

Как минимум n повторений x.

Жадная квантификация

x{n,m}

Между n и m повторений x

Жадная квантификация

x{n,}?

Как минимум n повторений x.

Ленивая квантификация

x{n,m}?

Между n и m повторений x

Ленивая квантификация

Примеры квантификаторов

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

Исходный код
.res = parse_regex_all!("[ERROR] [2024-10-05 10:01:00] [code: 500]", r'\[.*\]', numeric_groups: true)
Результат
[
  {
    "0": "[ERROR] [2024-10-05 10:01:00] [code: 500]"
  }
]

Если заменить квантификатор на ленивый: r'\[.*?\]', функция вернет отдельные подстроки в квадратных скобках.

Исходный код
.res = parse_regex_all!("[ERROR] [2024-10-05 10:01:00] [code: 500]", r'\[.*?\]', numeric_groups: true)
Результат
[
  {
    "0": "[ERROR]"
  },
  {
    "0": "[2024-10-05 10:01:00]"
  },
  {
    "0": "[code: 500]"
  }
]

Позиция в тексте

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

Представление Описание

^

Начало текста (в многострочном режиме — начало строки).

$

Конец текста (в многострочном режиме — конец строки).

\A

Только в начале текста, в том числе в многострочном режиме.

\z

Только в конце текста, в том числе в многострочном режиме.

\b

Граница слова Unicode: символ, соответствующий классу \w с одной стороны, и символ, соответствующий классу \W, либо граница текста, с другой стороны.

\B

Не на границе слова Unicode.

\b{start}, \<

Начало слова Unicode: символ класса \W или начало текста слева, символ класса \w справа.

\b{end}, \>

Конец слова Unicode: символ класса \w слева, символ класса \w или конец текста справа.

\b{start-half}

Проверка начала слова Unicode только слева: символ класса \W или начало текста.

\b{end-half}

Проверка конца слова Unicode только справа: символ класса \W или конец текста.

Примеры использования позиций

Следующая функция возвращает последовательности алфавитно-цифровых и соединительных символов на границе слова.

Исходный код
.res = parse_regex_all!("@guest, @superuser, @root", r'(?P<user>\b\w+)')
Результат
[
  {
    "user": "guest"
  },
  {
    "user": "superuser"
  },
  {
    "user": "root"
  }
]

Чтобы получить последовательности с символом @, изменим проверку начала слова.

Исходный код
.res = parse_regex_all!("@guest, @superuser, @root", r'(?P<user>\b{start-half}@\w+)')
Результат
[
  {
    "user": "@guest"
  },
  {
    "user": "@superuser"
  },
  {
    "user": "@root"
  }
]

Флаги

Регулярные выражения позволяют использовать флаги — модификаторы, которые изменяют поведение поиска для всего выражения или группы. Флаги могут быть объединены: r'(?ixm)pattern', r'(?im)pattern'. Флаги можно включать и выключать внутри выражения.

Опция Описание Состояние по умолчанию

i

Режим без учета регистра: буквы в выражении соответствуют и прописным, и строчным буквам в строке.

Выключен

m

Многострочный режим:

  • ^ соответствует началу новой строки.

  • $ соответствует концу строки.

Выключен

x

Режим с поддержкой комментариев. Строчные комментарии должны начинаться с символа #.

Пробелы при включенном режиме игнорируются. Чтобы добавить в шаблон пробел, используйте экранирование: \ ` или шестнадцатеричный код: \x20.

Выключен

s

Разрешает метасимволу точки . соответствовать символу новой строки \n.

Выключен

U

Меняет местами значение квантификаторов x* и x*? (ленивый режим).

Выключен

u

Поддержка Unicode.

Включен

Пример флага

Рассмотрим следующую функцию:

Исходный код
.res = parse_regex!("AaAaAbbBBBb", r'(?i)a+(?-i)b+', numeric_groups: true)
Результат
{
  "0": "AaAaAbb"
}

В начале регулярного выражения включается регистронезависимый режим, поэтому a+ соответствует буквам a и A. Однако b+, после выключения регистронезависимого режима, соответствует только строчной b.

Валидация и приведение типа

Для проверки типа регулярного выражения используйте функцию is_regex.

Для приведения типа к регулярному выражению используйте функцию regex.

Была ли полезна эта страница?

Обратная связь