Библиотека eslint-plugin-regexp расширяет возможности
ESLint, добавляя специализированные правила для анализа регулярных
выражений. Основная задача плагина — обнаружение ошибок, потенциальных
уязвимостей, проблем производительности и неочевидных логических
дефектов в regex-выражениях, используемых в JavaScript-коде.
Регулярные выражения часто становятся источником трудноуловимых ошибок: катастрофический бэктрекинг, избыточные группы, некорректные диапазоны символов, неоднозначные квантификаторы. Статический анализ позволяет выявлять такие проблемы на этапе линтинга, до выполнения кода.
eslint-plugin-regexp интегрируется в систему ESLint как
стандартный плагин. Он анализирует AST (Abstract Syntax Tree)
JavaScript-кода, извлекает узлы регулярных выражений и применяет набор
специализированных правил.
Основные источники анализа:
/pattern/flagsRegExp("pattern")Каждое правило реализует собственный анализатор, который работает либо на уровне синтаксиса regex, либо на уровне семантики (поведение выражения при выполнении).
Плагин устанавливается стандартным способом через npm:
npm install eslint-plugin-regexp --save-dev
Подключение в конфигурации ESLint:
{
"plugins": ["regexp"],
"extends": ["plugin:regexp/recommended"]
}
Режим recommended включает набор правил, ориентированных
на безопасное и производительное использование регулярных выражений.
Правила плагина группируются по функциональным областям анализа.
Эта группа выявляет ошибки, которые могут приводить к исключениям или неправильной интерпретации шаблона.
Примеры правил:
no-dupe-characters-character-class — обнаруживает
дублирующиеся символы в классахno-empty-character-class — запрещает пустые классы
[]no-misleading-capturing-group — выявляет неоднозначные
захватывающие группыПример проблемного выражения:
const re = /[a-z-a-z]/;
Проблема: дублирование диапазона символов, которое может приводить к некорректной логике.
Категория ориентирована на предотвращение регулярных выражений, вызывающих экспоненциальное время выполнения.
Ключевые правила:
no-super-linear-backtrackingno-lazy-endsno-evil-regexpПример опасного шаблона:
const re = /(a+)+b/;
Такие конструкции могут приводить к катастрофическому бэктрекингу при длинных входных строках, содержащих повторяющиеся символы.
Эти правила направлены на улучшение ясности регулярных выражений и предотвращение неоднозначного поведения.
Примеры:
prefer-d — рекомендует использовать \d
вместо [0-9]prefer-character-class — упрощает выражения через
классы символовno-useless-escape — выявляет избыточные
экранированияПример:
const re = /\./;
Если точка не требует экранирования в конкретном контексте, правило предложит упрощение.
Современные JavaScript-движки поддерживают расширенные режимы
Unicode. Плагин контролирует корректное использование флагов
u, v, i, g,
m, s.
Ключевые правила:
require-unicode-regexpno-useless-flagПример:
const re = /\p{L}/;
Без флага u выражение становится некорректным, что
фиксируется правилом.
Плагин способен анализировать вложенные группы, альтернативы и квантификаторы.
Пример анализа альтернатив:
const re = /(cat|catfish)/;
Здесь выявляется избыточность: cat является префиксом
catfish, что может привести к неэффективному порядку
ветвления.
Одной из ключевых возможностей является оценка сложности регулярного выражения.
Рассматриваются:
Пример проблемного шаблона:
const re = /^(a|a)*$/;
Такое выражение может вызывать экспоненциальный рост числа состояний при обработке входа.
Плагин анализирует не только литералы, но и строки, передаваемые в
RegExp:
const pattern = "(a+)+b";
const re = new RegExp(pattern);
Некоторые правила ограниченно анализируют такие случаи, так как динамическое формирование шаблонов снижает точность статического анализа.
Каждое правило может быть настроено через конфигурационный файл ESLint.
Пример расширенной настройки:
{
"rules": {
"regexp/no-dupe-characters-character-class": "error",
"regexp/no-super-linear-backtracking": "warn",
"regexp/prefer-d": "error",
"regexp/no-useless-escape": "error"
}
}
Уровни:
off — отключеноwarn — предупреждениеerror — ошибка сборкиПлагин предоставляет предустановленные наборы правил:
plugin:regexp/recommended — баланс безопасности и
практичностиplugin:regexp/strict — максимальный уровень проверок,
включая потенциально спорные ограниченияstrict режим усиливает контроль над сложными
выражениями, но может требовать корректировки существующего кода.
// было
const re = /[0-9]/;
// стало
const re = /\d/;
// было
const re = /\#/;
// стало
const re = /#/;
// было
const re = /(a+)+/;
// стало
const re = /a+/;
Несмотря на широкий охват, статический анализ регулярных выражений имеет ограничения:
Плагин не выполняет интерпретацию регулярных выражений, а опирается на структурный и семантический анализ AST и regex-парсера.
Использование eslint-plugin-regexp обычно включается в
общий процесс линтинга JavaScript-кода. Он работает совместно с другими
плагинами ESLint, не конфликтуя с ними, так как анализирует отдельную
предметную область — регулярные выражения.
Типичная схема применения:
eslint-plugin-regexp анализирует regex-узлыЭто позволяет выявлять ошибки, которые невозможно обнаружить стандартными средствами проверки кода.