Skip to main content
Version: 1.8

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

Регулярное выражение (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
info

В шаблонах контроля качества эти конструкции доступны для быстрой вставки в строке ввода регулярного выражения.

Специальные символы​

Следующие символы имеют специальное значение: . ^ $ * + ? { } [ ] ( ) | \.

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

Совпадение со всем значением​

Чтобы выражение сравнивалось со значением поля целиком, ограничьте его символами ^ в начале и $ в конце.

ВыражениеРезультат
^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\+\+