Регулярные выражения
Регулярное выражение (regex) — шаблон, который задает правило, которому должно соответствовать искомое значение.
Например, выражение ^CWE-(79|89)$ соответствует значениям CWE-79 и CWE-89.
Назначение
Обычный текстовый поиск находит значения, которые содержат введенную подстроку. Регулярные выражения позволяют искать данные по шаблону в следующих случаях:
- когда необходимо охватить группу значений одним условием (например, все библиотеки семейства
org.springframework, несколько CWE или все CVE определенного года); - когда необходимо задать значение, которое заранее неизвестно полностью или меняется (например, номер патч-версии библиотеки);
- когда необходимо задать несколько вариантов значения в одном условии (например,
log4jилиlogback).
Использование регулярных выражений в контролях качества
В шаблонах контроля качества регулярное выражение задает значение метрики шаблоном вместо точной строки.
Регулярное выражение можно задать в виде значения для следующих метрик:
- Категория;
- Источник;
- CVE;
- CWE;
- Файл;
- Совпадающий код;
- Версия библиотеки.
Режим ввода регулярного выражения включается вручную. Подробнее см. в разделе Работа с шаблонами контроля качества.
Поддерживаемые конструкции
Система поддерживает синтаксис регулярных выражений RE2. Основные конструкции представлены в таблице ниже.
| Конструкция | Описание | Пример | Совпадает с |
|---|---|---|---|
. | Любой одиночный символ | ^CWE-7.$ | CWE-78, CWE-79 |
^ | Начало строки | ^src/ | Значения, которые начинаются с src/ |
$ | Конец строки | \.jar$ | Значения, которые заканчиваются на .jar |
* | Ноль или более повторений предыдущего элемента | ^lo*g$ | lg, log, loog |
+ | Одно или более повторений предыдущего элемента | ^lo+g$ | log, loog (но не lg) |
? | Ноль или одно повторение предыдущего элемента | ^tests?/ | Значения, которые начинаются с test/ или tests/ |
{n,m} | От n до m повторений предыдущего элемента | ^CVE-2025-[0-9]{4,5}$ | CVE-2025-1234, CVE-2025-12345 |
[...] | Любой символ из перечисленных. Допускаются диапазоны [0-9], [a-z] | ^CWE-8[79]$ | CWE-87, CWE-89 |
[^...] | Любой символ, кроме перечисленных | ^[^/]+\.js$ | Файлы .js в корне репозитория (путь без /) |
(...) | Группа — объединяет несколько элементов в один | ^(src|lib)/ | Значения, которые начинаются с src/ или lib/ |
| | Альтернатива (логическое ИЛИ) | log4j|logback | Значения, которые содержат log4j или logback |
\ | Экранирование: следующий за ним специальный символ рассматривается как обычный | ^2\.17\.1$ | 2.17.1 |
В шаблонах контроля качества эти конструкции доступны для быстрой вставки в строке ввода регулярного выражения.
Специальные символы
Следующие символы имеют специальное значение: . ^ $ * + ? { } [ ] ( ) | \.
Чтобы использовать специальный символ как обычный, поставьте перед ним \. Например, чтобы найти точку в номере версии, используйте \., а не ..
Совпадение со всем значением
Чтобы выражение сравнивалось со значением поля целиком, ограничьте его символами ^ в начале и $ в конце.
| Выражение | Результат |
|---|---|
^CWE-79$ | Совпадает только с CWE-79 |
^CWE-79 | Совпадает с любым значением, которое начинается с CWE-79, — например, CWE-79 и CWE-798 |
Примеры использования
Ниже представлены примеры использования регулярных выражений.
| Метрика | Выражение | Описание |
|---|---|---|
| CWE | ^CWE-(78|79|89)$ | Внедрение команд ОС, XSS и SQL-инъекции |
| CVE | ^CVE-2025-[0-9]+$ | Уязвимости с годом 2025 в идентификаторе |
| Файл | ^src/.*\.py$ | Python-файлы в каталоге src и его подкаталогах |
| Файл | ^tests?/ | Файлы в каталогах test и tests |
| Версия библиотеки | ^1\.[0-9]+\.[0-9]+$ | Все версии ветки 1.x |
| Версия библиотеки | ^2\.17\.[0-9]+$ | Все патч-версии 2.17 |
| Совпадающий код | .*(password|secret).* | Фрагменты кода, которые содержат password или secret |
Распространенные ошибки
В таблице ниже представлены ошибки, которые могут возникнуть при использовании регулярных выражений, а также способы их исправления.
| Ошибка | Пример | Способ исправления |
|---|---|---|
| Точка не экранирована | 2.17.1 также совпадает с 2a17b1 | Экранируйте точку: 2\.17\.1 |
Отсутствуют спецсимволы ^ и $ | CWE-79 может совпасть с CWE-798 | Ограничьте выражение: ^CWE-79$ |
| Указана альтернатива без группы | ^CWE-79|89$ означает «начинается с CWE-79» ИЛИ «заканчивается на 89» | Объедините варианты в группу: ^CWE-(79|89)$ |
| Найдена незакрытая скобка | ^CWE-(79|89$ | Проверьте, что у каждой ( и [ есть парная закрывающая скобка |
| Обычный текст распознан как регулярное выражение | Поиск C++ возвращает некорректный результат | Экранируйте специальные символы: C\+\+ |