Command Palette

Search for a command to run...

Тестер регулярного выражения: отладка регулярных выражений против реального текста

Тестер регулярного выражения: отладка регулярных выражений против реального текста

T
Toolz Team
|Jul 14, 2026|17 Мин. читать

Часть коллекции регулярный

Я проиграл большую часть дня один раз одному жадному квантору. Я писал карту перенаправления для миграции WordPress - несколько сотен старых URL-адресов, которые нужно было переписать на новые слизни - и у меня был регекс, который был предполагаемый Чтобы захватить конечный слизень с каждого пути. Он работал на трех URL, которые я тестировал в своей голове. На четвертом, который имел два отрезка пути, не сработало, т.к. .* С радостью проглотил первую косую и все после нее. Правило бесшумно перенаправило половину сайта не в то место, и я узнал от читателя, а не из своего тестирования, потому что мое «тестирование» смотрело на узор и доверяло ему.

Это основная проблема с регулярными выражениями: они предназначены только для записи, пока вы не запустите их против чего-то. Шаблон читается как правдоподобный вплоть до момента, когда реальный вход доказывает, что он неверен, а режимы отказа тихие. Регулярное выражение, которое ничто не выдает ошибку. Регулярное выражение, которое слишком много соответствует, не выдает ошибок. Регулярное выражение с тонкой группой захвата передает вам не ту подстроку и двигается дальше. Единственный способ узнать, что шаблон делает то, что вы думаете, — это накормить его грязным текстом, нагруженным краем, он действительно увидит и взгляд на что он захватывает.

равняется Тестер регулярного выражения закрывает этот пробел. вы помещаете свой шаблон в одно поле, ваш образец текста в другое, и каждый матч загорается на месте - с разбитыми группами захвата, чтобы вы могли точно видеть, какой срез строки попал в группу 1 против группы 2. Тот, который я построил для Toolz.dev, работает на браузере и #39;s родной RegExp engine, тот же, что использует ваш код JavaScript и TypeScript, поэтому в тестере вы видите то, что вы получаете в производстве. Нет приближения, нет «достаточно близко».

В этом руководстве рассказывается, как использовать тестер для быстрой отладки шаблонов, что на самом деле делает каждый флаг, как группы захвата и именованные группы отображаются в выводе, а также специфичные для JavaScript gotchas, которые сбивают людей с толку из Python или PCRE.

TL;DR: Вставьте свой шаблон в Toolz.dev регулярный тестер (не нужны косые черты), переключите флаги G/I/M/S/U/Y и оставьте свой тестовый текст ниже. Совпадения выделяют вживую с чередующимися цветами, каждая пронумерованная и именованная группа захвата указана на совпадение, а синтаксические ошибки показывают точное сообщение движка. Он использует реальный движок REGEXP JavaScript, запускает 100% клиентскую, поэтому чувствительные журналы никогда не загружаются и сочетаются с регулярный конструктор Для сборки узоров с нуля.


Как проверить регулярное выражение, не запуская всю свою программу?

Медленный способ отладки регекса - это цикл, с которого большинство из нас начинают: редактировать шаблон в своем коде, запускать программу, читать выходные данные, угадывать, что пошло не так, повторять. Каждая итерация стоит полного запуска программы, а обратная связь косвенная - вы видите следствие матча, а не сам матч.

Тестер сворачивает этот цикл до нуля. Вы вставляете шаблон, вставляете текст репрезентативного и сразу же видите совпадения. Когда вы меняете один символ в шаблоне, обновляются яркие моменты. Это стягивает обратную связь до точки, где вы можете исследовать- попробуй а + где у вас был *, добавьте границу слова, сделайте группу не захватывающей - и наблюдайте за эффектом приземления в реальном времени, а не воображая его.

Ключевая дисциплина - использование реальный тестовый текст, а не чистый пример в вашей голове. URL-адрес, который сломал мою карту перенаправления, имел два сегмента пути; мой мысленный тестовый пример имел один. Если бы я вставил фактический список старых URL-адресов в тестер, жадное совпадение было бы явно неправильным в четвертой строке. Возьмите фактические строки журнала, фактические пользовательские входы, фактические пути к файлам, включая уродливые, и позвольте тестеру показать вам, где шаблон разваливается, прежде чем ваши пользователи это сделают.

Что на самом деле меняются флаги регулярных выражений?

Флаги изменяют способ применения всей паттерна, и их непонимание стоит за большой долей "почему не работает эта работа". выше испытатель Открывает все шесть флагов JavaScript как переключатели, чтобы вы могли перевернуть один и посмотреть сдвиг результата.

г - глобальный. Без него сопоставление останавливается при первом ударе. С его помощью движок находит каждое совпадение в тексте. В тестере Global включен по умолчанию, потому что вы почти всегда хотите видеть все совпадения; отключите его, чтобы подтвердить, что вызывает один матч. String.match без g Вернется.

я - игнорирую случай. делает весь шаблон нечувствительным к регистру, поэтому error спичка Error а ERROR, йо- Прямое и наиболее часто используемый флаг после G.

м - многолинейный. Этот очень неправильно понимается. это делает не становиться . Перекрестные разрывы. это меняет то, что ^ а $ Якорь к: с m, они совпадают в начале и в конце каждого строй, а не только начало и конец всей струны. Если вы сопоставляете построчно в журнале, вам нужно это.

с - точкаВсе. Это флаг, который делает . Сопоставьте символы новой строки. Без него, . Соответствует любому символу кроме Разрыв линии, поэтому шаблон, предназначенный для охвата нескольких линий, часто тихо останавливается на первой. Если ваша совпадение должно пересечь границы линий, s то, что вам нужно - нет m, йо-

у - юникод, йо- Включает полный режим Unicode, который делает \u{...} Побег работает, рассматривает суррогатные пары как отдельные кодовые точки и делает классы символов такими, как \p{Letter} доступный. Важно, когда в вашем тексте есть смайлики или нелатинские скрипты.

y - липкий. привязывает каждую попытку совпадения к точному положению lastIndex, поэтому сопоставление успешно только в том случае, если оно начинается именно там. Это нишевый флаг, используемый в токенеизаторах и парсерах; большинство повседневных работ никогда не касаются его.

Путаница, которая стоит больше всего времени, m против s, йо- Люди тянутся к мультилинии, когда имеют в виду тошель. Если ваша точка не пересекает линии, вам нужно s, йо- Если ваши якоря не поражают границы линий, вам нужно m, йо- Они решают разные задачи и часто используются вместе.

Как отображаются группы захвата на выходе?

Скобки в паттерне выполняют две работы: они группируют подпаттерны для квантификаторов или чередования, и они захват совпадающий срез для извлечения. Когда вы & #39;re используете regex для извлечения данных из текста - дата's год и месяц, строка журнала's отметка времени и уровень - группы захвата - это вся точка, и их неправильное получение является наиболее распространенным источником & quot;шаблон совпадает, но я получил неправильную строку. & quot;

выше испытатель Перечисляет каждое совпадение с его группами захвата, разбитыми под ним. Группа 1 — это первая подпаттернированная скобка, группа 2 — вторая и т. д., каждая из которых отображается с точным текстом, который он захвачен для этого совпадения. Это делает очевидными ошибки групповых границ: если группа 1 захватила больше, чем вы ожидали, вы можете увидеть ее и втянуть скобки.

Названные группы получают такое же лечение. Когда ты пишешь (?<year>\d{4})-(?<month>\d{2}), тестер показывает захваты по имени - <year> а <month>- наряду с их пронумерованными эквивалентами, чтобы вы могли подтвердить сопоставление имен с намеченными вами фрагментами, прежде чем полагаться на них match.groups.year в коде. Именованные группы делают шаблоны самодокументации и кодированием более читабельным, и правильность их разрешения в тестере — это самый быстрый способ доверять им.

Связанная ловушка Наводит на поверхность тестировщика: группа, которая участвует в шаблоне, но не совпадает с заданной попыткой, показывается как "не совпадение" вместо пустой строки. Это различие имеет значение, потому что в JavaScript такая группа undefined, и код, который предполагает, что это всегда будет вести строку. Видя его в тестере, вам нужно защитить этот доступ.

Что это за вкус регулярного выражения и почему он имеет значение?

Регулярные выражения — это не один язык. Шаблон, который работает в Python&#39;s re модуль может вести себя по-другому - или бросать - в JavaScript, и наоборот.Это испытатель использует JavaScript (ECMAScript) движок, встроенный в ваш браузер, который побайт запускает тот же движок Node.js. Итак, если вы &#39;записываете код JavaScript, TypeScript или Node, результаты здесь - это именно то, что будет делать ваш код.

Эта точность режет оба пути. Если вы скопируете шаблон из ответа на переполнение стека, написанного для PCRE (PHP и preg_ функции, которые я использую постоянно в работе WordPress) или для Python, некоторые функции won&#39;t translate.JavaScript исторически не имел утверждений lookbehind, получил их относительно недавно, и все еще обрабатывает некоторые свойства Unicode escapes по-другому Притяжательные кванторы и атомные группы из PCRE don&#39; не существуют в JavaScript вообще.Recursion - функция PCRE для сопоставления вложенных структур - не имеет эквивалента JavaScript.

Практический результат: проверьте вкус, который вы развернете. Тестер, который точно реализует один движок, более полезен, чем тот, который реализует нечеткое среднее из всех, потому что «он работал в тестере» должен означать «это будет работать в моем коде». есть источник истины. Более широкий набор инструментов для такого рода языковой проверки рассматривается в Руководство по инструментам кодирования, йо-

Каковы повседневные применения тестера регулярного выражения?

Строительство и отладка шаблонов проверки

Поля электронной почты, номера телефонов, почтовые индексы, слизни, строки семантической версии - каждая форма что-то подтверждает, а проверка обычно представляет собой регекс. Тестер позволяет вам бросать неловкие случаи в ваш шаблон перед отправкой: электронное письмо с тегом с плюсовым адресом, номер телефона с расширением, строка версии типа 1.10.0 что наивный узор усекает. Вставьте столбец реальных значений и посмотрите, какие из них не совпадают.

Извлечение данных из журналов

Журналы серверов, журналы приложений и экспорт CSV - это полуструктурированный текст, и regex - это то, как вы вытаскиваете из них поля. Группы захвата захватывают временную метку, уровень, идентификатор запроса. Разбивка группы по тестеру и #39;s на матч - это именно тот вид, который вам нужен здесь - вставить дюжину реальных строк журнала и подтвердить, что каждое поле попадает в правильную группу по всем из них, а не только по опрятной первой строке. Это совпадает с Рабочий процесс отладки API где тел ответов и заголовки очищаются для конкретных значений.

Поиск и замена в базе кода

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

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

Live Highlighting делает тестировщика настоящим инструментом обучения. Создайте шаблон по одному токену и наблюдайте, как матч сжимается и растет, когда вы добавляете якоря, квантификаторы и классы. вид \d+ возьмите целое число, а затем \d Прихватить одну цифру для понимания больше, чем любое прозаическое объяснение. Когда вы готовы собрать шаблон из компонентов, а не отлаживать существующий, регулярный конструктор является сопутствующим инструментом.

Как избежать ловушки совпадения нулевой длины?

Шаблон, который может соответствовать пустой строке - a*, \d*, (foo)?- может &quot;match&quot; в каждой позиции между символами, создавая поток пустых совпадений. Наивный код соответствия, который не &#39;t навсегда проходит циклы совпадений нулевой длины. The испытатель защищается от этого внутренне, всегда продвигаясь, так что он никогда не висит, но вести Вы пустые совпадения.

Этот дисплей является особенностью, а не шумом. Куча пустых совпадений — это тестер, говорящий вам, что ваш квантификатор слишком разрешителен. Если вы имели в виду «одну или несколько цифр», вы написали \d* Когда ты хотел \d+, йо- Если группа должна потребоваться, вы пометили ее необязательно с помощью ?, йо- Просмотр пустых совпадений — это диагностика, которая указывает вам на исправление. Когда ваш шаблон правильный, совпадения — это подстроки, которые вам небезразличны, и ничего больше.

Регулярное выражение JavaScript против других вкусов: краткое сравнение

важничать JavaScript (этот тестер) PCRE (PHP) питон re
Именованные группы (?<name>...) (?<name>...) или (?P<name>...) (?P<name>...)
глядя Поддерживается (современные двигатели) поддерживаемый поддерживаемый
Атомные группы / притяжательные не поддерживается поддерживаемый ограниченный
рекурсия не поддерживается поддерживаемый не поддерживается
Флаг новой строки s (тотал) s (тотал) re.DOTALL
Свойство Юникода \p{...} требователь u знамя требователь u модификатор regex Только модуль
липкое соответствие y знамя \G якорь \G-как через match положение

Урок стола в том, что «регулярное выражение» — это семья, а не стандарт. Синтаксис перекрывается настолько, что вы убаюкиваете шаблоны копирования между языками, и различия в них в точности — это то, что вы используете в сложных проблемах. Проверьте свой целевой вкус. Для JavaScript и Node это тестер; Набор инструментов для веб-разработчиков Охватывает место, где подходят другие языковые инструменты.

Безопасно ли тестировать регулярное выражение на чувствительный текст?

Текст, на котором вы тестируете регулярное выражение, часто является чувствительным: производственные строки с IP-адресами и идентификаторами пользователей, экспорт с адресами электронной почты, конфигурационные файлы с внутренними именами хостов. Это именно те данные, которые вы не должен&#39;T Вставьте в инструмент, который отправляет его на сервер.

выше Toolz.dev регулярный тестер полностью работает в вашем браузере. компиляция шаблонов, сопоставление, извлечение группы - все это JavaScript на стороне клиента, без сетевого запроса, несущего ваш шаблон или ваш текст где угодно. Вырежьте соединение после загрузки страницы, и оно продолжит работать.Th&#39;s гарантия архитектуры, а не предложение политики конфиденциальности, и it&#39;s тот же принцип браузера - прежде всего за каждым инструментом в наборе, изложенный в наборе Руководство по конфиденциальности данных, йо-

Это означает, что вы можете вставить реальные строки журнала - те, которые имеют фактическую PII, которая создает шаблон & #39;s появляются крайние случаи - и безопасно отладить их. Это & # 39;s весь момент: тестер полезен только в том случае, если вы подаете ему реальный ввод, а реальный ввод часто является именно тем, что вы можете & # 39;t отправить кому-то другому& # 39;s сервер.

часто задаваемые вопросы

Как проверить регулярное выражение в Интернете?

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

Какой вкус регулярного тестера использует этот тестер?

Он использует встроенный в ваш браузер движок JavaScript (ECMAScript) REGEXP, который идентичен движку в node.js. Результаты соответствуют тому, как один и тот же шаблон ведет себя в JavaScript и TypeScript. Регулярное выражение JavaScript отличается от PCRE, модуля RE Python и шаблонов Java в некоторых продвинутых функциях, таких как атомарные группы и рекурсия, поэтому тестируйте, в которых вы будете развертываться.

Что означают флаги регулярных выражений G, I, M и S?

Флаг g (глобальный) находит все совпадения вместо остановки на первом Флаг i делает сопоставление нечувствительным к регистру Флаг m (многострочный) делает якоря ^ и $ совпадающими при разрыве строки, а не только начало и конец строки Флаг s (dotAll) позволяет точке соответствовать символы новой строки тоже Флаги m и s часто путаются - m меняет якоря, s меняет точку.

Как работают группы захвата в тестере?

Скобки в вашем шаблоне создают группы захвата. Тестер перечисляет каждую пронумерованную группу с текстом, который он захвачен для каждого совпадения, поэтому вы можете проверить, какой фрагмент строки захватывает каждая часть шаблона. Именованные группы написаны как (?...) отображаются по имени рядом с пронумерованными группами.

Почему мое регулярное выражение ничему не соответствует или выдает ошибку?

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

Как сопоставить несколько строк?

Включите флаг S (Dotall), если вам нужна точка, чтобы точка прошла в строке, и включите флаг M (многостроение), если вы хотите, чтобы якоря ^ и $ совпадали в начале и в конце каждой строки. Объединение обоих позволяет естественным образом работать с одним шаблоном против многострочных входных данных, таких как журналы или строки CSV.

Безопасно ли тестировать регулярное выражение на конфиденциальные данные?

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

В чем разница между тестером регулярных выражений и конструктором регулярных выражений?

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


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

Frequently Asked Questions

Enter your pattern in the pattern field without the surrounding slashes, choose your flags, and paste sample text into the test area. Matches highlight instantly and capture groups are listed for each match. Everything runs in your browser — nothing is uploaded.

Comments

0 comments

0/2000 characters

No comments yet. Be the first to share your thoughts!