LazowskiAnton · Extensions

RegexSmith

Регулярные выражения с объяснением и проверкой прямо там, где они написаны. Наведите курсор на шаблон в C# — и увидите по строке на каждую часть простыми словами, группы в цвете и подходящие строки; шаблоны, которые могут зависнуть, подчёркнуты; проверяйте свои примеры в окне Тестер RegexSmith и записывайте шаблон обратно одним щелчком.

Бесплатно · Visual Studio 2022 и 2026 · 14 языков интерфейса · без телеметрии

Зачем RegexSmith

Карточка при наведении на шаблон [GeneratedRegex]: шаблон с цветными группами, по строке на каждую часть простыми словами, подходящие примеры и один неподходящий, и статус ✓ безопасно

Простые слова, а не урок синтаксиса

^(?<year>\d{4})-(?<id>\d{1,5})$ превращается в «Начало текста», «Число цифр: ровно 4», «Число цифр: от 1 до 5» — по строке на каждую часть, с вложением под свою группу, каждая группа своим цветом.

Проверено настоящим движком

Примеры в карточке и каждый результат в тестере получены от самого движка регулярных выражений .NET с параметрами вызова. Что вы видите, то и сделает ваше приложение.

Шаблоны, которые могут зависнуть

([a-z0-9]+\.?)+ выглядит безобидно, но может подвесить запрос на длинной строке, которая почти совпадает. RegexSmith подчёркивает такие повторения и исправляет их через Ctrl+.

Бесплатно и без подвохов

Без подписок, без «pro»-версии, без сбора данных и без сообщений в окне «Вывод» или при запуске. Шаблоны и примеры остаются на вашем компьютере. Единственное, о чём мы когда-нибудь попросим, — после того как вы им немного попользуетесь, — поставить оценку в Marketplace. Работает в Visual Studio 2022 и 2026, x64 и ARM64.

Возможности

Карточка при наведении

Наведите курсор на строку шаблона — и в обычной подсказке Visual Studio появится карточка RegexSmith: что означает шаблон, чему он соответствует и безопасен ли он.

Карточка при наведении: заголовок с видом и параметрами, шаблон с цветными группами, по строке на каждую часть с вложением под группы, примеры и кнопка «Проверить шаблон»

Где это работает

В файлах C#, над шаблоном в:

Обычные, буквальные (@"…") и необработанные ("""…""") строки читаются так же, как их читает компилятор, поэтому "\\d" и @"\d" — один и тот же шаблон.

Что показывает карточка

На экранеЗначение
RegexSmith · Регулярное выражение .NET · IgnoreCaseВид шаблона и параметры, прочитанные из вызова, а справа — статус.
ШаблонСкобки каждой захватывающей группы — её цветом, содержимое подчёркнуто тем же цветом; сам текст остаётся цвета темы, поэтому легко читается.
Число цифр: ровно 4По строке на каждую часть простыми словами — «Начало текста», «Один из текстов: “jpg”, “png”», «Число цифр: от 1 до 5» — с вложением под свою группу. Очень длинный шаблон заканчивается строкой … ещё N.
Метки группИмя или номер каждой группы на метке её цвета — тех же цветов, что в шаблоне и под кодом.
✓ Совпадают: … ✗ Не совпадает: …Две подходящие строки и одна неподходящая, составленные по шаблону и проверенные настоящим движком .NET. Пробелы показаны бледными точками.
▶ Проверить шаблон…Открывает шаблон в тестере RegexSmith.

Статус

На экранеЗначение
✓ безопасно.NET принимает шаблон, и ничто в нём не может вызвать катастрофический возврат.
⚠ может зависнутьПовторение может занять экспоненциальное время на длинном вводе, который почти совпадает; карточка называет вид проблемы (RX001) и подсказывает, что Ctrl+. предлагает исправления.
✕ недопустимоДвижок отвергает шаблон; карточка показывает его сообщение: .NET не принимает этот шаблон: …

«Безопасно» означает только это: .NET принимает шаблон, и он не может зависнуть. Это не значит, что он совпадает с тем, что вы задумали, — для этого и нужны примеры и тестер.

Подчёркивание групп

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

Группа внутри другой группы расположена чуть ниже, так что видны обе линии. Цвета идут по порядку: лососевый, зелёный, синий, фиолетовый, янтарный, бирюзовый — и снова по кругу.

Подчёркивание можно выключить в настройках: Подчёркивать группы захвата.

Шаблоны, которые могут зависнуть

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

Волнистая линия RX001 под ([a-z0-9]+\.?)+ с открытым меню Ctrl+. и предпросмотром исправления: старый шаблон зачёркнут, новый — с атомарной группой

Что подчёркивается (RX001)

Не внутри атомарных групп и проверок окружения и никогда с RegexOptions.NonBacktracking — там это невозможно.

Исправления в Ctrl+.

Поставьте курсор на волнистую линию и нажмите Ctrl+. — каждое исправление показывает предпросмотр: шаблон до (зачёркнутый) и после.

ИсправлениеЧто делает
Сделать внутреннее повторение атомарным: (?>…)Оборачивает внутреннее повторение в (?>…). Совпадают те же строки; повторение больше нельзя разбить множеством способов.
Использовать RegexOptions.NonBacktracking (.NET 7+)Добавляет параметр в вызов. Линейное время на любых входных данных; нужен .NET 7 или новее. Предлагается, только если шаблон это допускает: без обратных ссылок, проверок окружения, атомарных и балансирующих групп и условий.
Проверить этот шаблон в RegexSmithОткрывает шаблон в тестере — предлагается над любым шаблоном, а не только над рискованным.

RX001 можно выключить в настройках (Подсказки в редакторе) или ссылкой Не показывать такие подсказки во всплывающей подсказке; исправления в Ctrl+. остаются.

Тестер

Тестер RegexSmith открывается закреплённым рядом с окном «Результаты поиска». Шаблон берётся из кода и остаётся связанным с ним: проверьте его на своих примерах, измените и запишите обратно.

Тестер RegexSmith: ссылка на источник, шаблон, строка статуса, кнопки параметров, примеры с ожиданиями и подсвеченными группами, неверная строка красным, таблица групп и кнопки

Как открыть

Шаблон и его параметры

Вверху — файл и строка шаблона; щёлкните, чтобы перейти туда. Ниже — поле шаблона, строка статуса (✓ безопасно, ⚠ может зависнуть или ошибка движка, затем N из M как ожидалось · мс) и кнопки параметров: IgnoreCase, Multiline, Singleline, IgnorePatternWhitespace, ExplicitCapture, RightToLeft, CultureInvariant. Любое изменение сразу запускает проверку заново.

Примеры и ожидания

В первый раз там уже есть примеры из карточки: два, которые должны совпасть, и один, который не должен. Введите новый в поле Добавьте пример и нажмите Enter…; щёлкните пример, чтобы изменить его, ✕ удаляет его. Значок перед каждым примером говорит, что он должен делать, — щёлкните его, чтобы поменять:

На экранеЗначение
✓должен совпасть
✗не должен совпасть
–без ожидания, просто показать

Пример, который ведёт себя наоборот, становится красным — ✗ совпадает или ✗ не совпадает, — так примеры превращаются в маленькую спецификацию шаблона. Совпадения подкрашены, группы подчёркнуты своими цветами, пробелы показаны точками. Проверка, которая длится больше 1 секунды, останавливается с пометкой ⏱ слишком медленно.

Группы выбранного примера перечисляет все совпадения выбранного примера: сначала всё совпадение, затем каждую группу с её значением и позицией (не захвачена, если группа не участвовала).

Замена

Вкладка Замена добавляет поле замены — $1, ${name}, $$ для $ — и показывает результат для каждого примера так, как это сделал бы Regex.Replace.

Копировать, вернуть, применить

Копировать как модульный тест помещает в буфер обмена тест с вашими примерами для xUnit, NUnit или MSTest — спецификация переезжает в тестовый проект.

Вернуть восстанавливает шаблон и параметры из кода; примеры остаются.

Применить к коду записывает шаблон обратно литералом того же вида, каким он был (обычным, буквальным или необработанным), вместе с параметрами — одна отмена возвращает всё назад. Если этот код изменился после того, как тестер его открыл, ничего не записывается: откройте тестер из шаблона заново.

Примеры запоминаются для каждого шаблона и каждого решения в %LocalAppData%\RegexSmith\samples, так что в следующий раз они уже на месте. В репозиторий ничего не попадает.

Настройки

Средства › Параметры › SmithWorks › RegexSmith. У каждого параметра есть краткое описание того, что он делает.

ПараметрПо умолчанию
Объяснять шаблоны при наведениивкл.
Подчёркивать группы захватавкл.
RX001 Катастрофический бэктрекингвкл.
Попросить оценку в Marketplaceвкл.

Внизу: Сбросить по умолчанию, Документация, Оценить на Marketplace и Обратная связь.

Настройки хранятся в %LocalAppData%\RegexSmith.

Страница параметров RegexSmith
Страница параметров.

Вопросы и ответы

RegexSmith отправляет какие-нибудь данные?

Нет. Шаблоны читаются из открытого документа и выполняются на вашем компьютере; примеры хранятся в %LocalAppData%\RegexSmith. Ни сетевых запросов, ни телеметрии.

Карточка пишет «✓ безопасно». Значит, шаблон правильный?

Не обязательно. «Безопасно» означает, что .NET принимает шаблон и ни одно повторение в нём не может вызвать катастрофический возврат. Совпадает ли он с тем, что вы задумали, должны показать примеры: отметьте их ✓ или ✗ в тестере.

Почему над моим шаблоном нет карточки?

Карточка появляется над строковым литералом, про который RegexSmith знает, что это шаблон: аргумент new Regex, статического метода Regex, [GeneratedRegex] или [RegularExpression] либо константа из того же файла, используемая там. Шаблон, собранный во время выполнения (склеенный, прочитанный из настроек), прочитать нельзя. Проверьте также параметр Объяснять шаблоны при наведении в настройках.

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

Движок регулярных выражений .NET, на котором работает сама Visual Studio, с параметрами вызова. RegexOptions.NonBacktracking (.NET 7+) тоже читается из вызова; примеры тогда выполняются на обычном движке, и совпадают одни и те же строки в обоих случаях.

«Применить к коду» ничего не сделало.

Код шаблона изменился после того, как тестер его открыл, поэтому RegexSmith не пишет в место, где шаблона может уже не быть, — тестер сообщает об этом под кнопками. Откройте тестер из шаблона заново. Если в коде нет места для параметров ([RegularExpression] их не принимает), шаблон записывается, а параметры — нет.

Работает ли он в VB.NET, JavaScript или TypeScript?

В версии 1.0 — нет, только C#. В других языках другие движки; если вам нужен какой-то из них, напишите в репозиторий Feedback.

Где сообщить о проблеме или предложить идею?

Создайте issue в репозитории Feedback на GitHub — там есть формы для ошибок и идей (пожалуйста, замените закрытые имена). Можно также воспользоваться вкладкой Q&A на Marketplace.

История изменений

1.0.1

1.0.0