Что значит «проверить регулярное выражение»?
Тест регулярного выражения (« regex test online », « tester regex javascript ») означает выполнить шаблон на реальном тексте и посмотреть, что движок действительно возвращает: совпавшие строки, их положение и значения групп захвата. Шаблон, который « выглядит верным», ничего не доказывает, пока не отработал на ваших данных, — это единственное различие между regex из учебника и regex в продакшене.
Тест отвечает на три разных вопроса. Есть ли совпадение : таблица совпадений показывает это сразу. Где и сколько : индекс и длина показывают, стоял ли якорь на правильном месте. Что именно захватывается : нумерованные и именованные группы показывают, та ли часть извлекается, как вы рассчитывали.
Метасимволы, которые решают всё
Точка . заменяет любой символ, кроме новой строки — отсюда флаг s для многострочного текста. Квантификаторы *, + и ? оказываются жадными : они останавливаются на первом достаточном числе повторений. Суффикс ? (*?, +?, {2,5}?) меняет это поведение и даёт ленивую версию, которую почти всегда лучше выбрать, когда .* пожирает конец строки.
Квадратные скобки задают класс: [abc] принимает символ из перечисленных, [^abc] всё, кроме них, [a-z0-9] диапазон. Внимание: отрицание в начале класса — [^...] действует только в первой позиции, иначе ^ снова становится литеральным. Знак | разделяет альтернативы и работает с низким приоритетом: ^cat|dog$ означает «весь текст — cat» или «весь текст — dog», а не «cat в начале или dog в конце» — тогда нужна группировка: ^(?:cat|dog)$.
Группы, lookahead и lookbehind
Скобки захватывают. Группе 1 можно получить через $1 на стороне замены, а \1 на стороне шаблона; именованные группы — через $<nom> и \k<nom> — гораздо нагляднее, начиная с трёх групп. (?:...) объединяет, не создавая номера — так лучше поступать, если захват нужен только ради структуры.
Проверки позиции (lookaround) ничего не потребляют: (?=...) требует, чтобы то, что идёт дальше, совпало, (?!...) запрещает это, (?<=...) и (?<!...) делают то же для того, что предшествует. Так требуют специальный символ в пароле, не включая его в захват: ^(?=.*\d)(?=.*[A-Z]).{12,}$.
ReDoS: когда regex превращается в бомбу замедленного действия
Термин ReDoS (Regular Expression Denial of Service) происходит от backtracking : при почти корректном вводе шаблон вроде (a+)+$ перебирает все способы разрезать «a» перед тем, как потерпеть неудачу, а число комбинаций растёт экспоненциально. Два правила: проверяйте шаблон на реальном объёме — вкладка «Производительность» сделает это за вас — и никогда не запускайте непроверенную regex на внешних данных без ограничения размера. На сервере зависшая regex блокирует весь worker до истечения таймаута.
JavaScript, PCRE, Python: общая основа и несколько различий
Тестер использует нативный движок браузера, то есть ECMAScript. Базовый синтаксис — классы, квантификаторы, группы, lookahead, флаги g i m s u y — общие для PCRE (PHP, Perl), Python с re, Java и Go. Различия касаются прежде всего lookbehind (долго отсутствовал в JavaScript, теперь поддерживается), свойств Unicode и встроенных флагов, таких как (?i), характерных для PCRE. Поэтому перенос шаблона из одного языка в другой — работа с деталями, а не с изобретениями.
Рекомендуется
Фронтенд- и бэкенд-разработчики (валидация форм, разбор журналов, миграция данных), ops и DevOps (фильтры конфигураций, правила WAF), тестировщики и аналитики (извлечение столбцов, проверка формата), редакторы и data-аналитики (очистка файлов), студенты (понимание метасимволов) — и все, кому нужен тестер регулярных выражений — быстрый, полноценный и конфиденциальный, а также форматтер JSON, кодировщик и декодировщик URL, кодировщик и декодировщик Base64 и кодировщик и декодировщик JWT.