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

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

21 ответ

Решение

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

альтернативный текст

Также, по словам разработчика, этот инструмент работает практически без ошибок в Linux при использовании с WINE.

С Perl 5.10, use re 'debug';, (Или же debugcolor, но я не могу правильно отформатировать вывод в переполнении стека.)

$ perl -Mre = debug -e '"foobar" = ~ / (.) \ 1 /'
Компиляция REx "(.)\1"
Финальная программа:
   1: OPEN1 (3)
   3:   REG_ANY (4)
   4: ЗАКРЫТЬ 1 (6)
   6: REF1 (8)
   8: КОНЕЦ (0)
минлен 1
Соответствует REx "(.)\1" против "foobar"
   0 <>  | 1: OPEN1 (3)
   0 <>  | 3: REG_ANY (4)
   1   | 4: CLOSE1 (6)
   1   | 6: REF1 (8)
                                  не удалось...
   1   | 1: OPEN1 (3)
   1   | 3: REG_ANY (4)
   2   | 4: CLOSE1 (6)
   2   | 6: REF1 (8)
   3   | 8: КОНЕЦ (0)
Матч успешен!
Освобождение REx: "(.)\1"

Кроме того, вы можете добавить пробелы и комментарии к регулярным выражениям, чтобы сделать их более удобочитаемыми. В Perl это делается с помощью /x модификатор. С pcre, Здесь PCRE_EXTENDED флаг.

"foobar" =~ /
    (.)  # any character, followed by a
    \1   # repeat of previously matched character
/x;

pcre *pat = pcre_compile("(.)  # any character, followed by a\n"
                         "\\1  # repeat of previously matched character\n",
                         PCRE_EXTENDED,
                         ...);
pcre_exec(pat, NULL, "foobar", ...);

Когда я застреваю в регулярном выражении, я обычно обращаюсь к этому: https://regexr.com/

Это идеально подходит для быстрого тестирования, где что-то идет не так.

Я добавлю еще один, чтобы я не забыл его: debuggex

Это хорошо, потому что это очень наглядно: Фотография помощника по регулярным выражениям Debuggex

Я использую Kodos - отладчик регулярных выражений Python:

Kodos - это утилита Python GUI для создания, тестирования и отладки регулярных выражений для языка программирования Python. Kodos должен помочь любому разработчику эффективно и без усилий разрабатывать регулярные выражения в Python. Поскольку реализация регулярных выражений в Python основана на стандарте PCRE, Kodos должен помочь разработчикам на других языках программирования, которые также придерживаются стандарта PCRE (Perl, PHP и т. Д.).

(...)

http://kodos.sourceforge.net/images/match.gif

Работает на Linux, Unix, Windows, Mac.

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

Существует отличный бесплатный инструмент, Regex Coach. Последняя версия доступна только для Windows; его автор, доктор Эдмунд Вайц, прекратил поддерживать версию для Linux, потому что ее скачивали слишком мало людей, но на странице загрузки есть более старая версия для Linux.

Я только что видел презентацию Regexp::Debugger от ее создателя: Дамиана Конвея. Очень впечатляющие вещи: запуск на месте или использование инструмента командной строки (rxrx), в интерактивном режиме или в "зарегистрированном" исполняемом файле (хранящемся в JSON), шаг вперед и назад в любой точке, остановка на точках останова или событиях, цветной вывод (настраивается пользователем)), тепловые карты для регулярных выражений и строк для оптимизации и т.д...

Доступно на CPAN бесплатно: http://search.cpan.org/~dconway/Regexp-Debugger/lib/Regexp/Debugger.pm

Я использую этот онлайн-инструмент для отладки моего регулярного выражения:

http://www.regextester.com/

Но да, это не может победить RegexBuddy.

Что касается меня, я обычно использую утилиту pcretest, которая может записать байт-код любого регулярного выражения, и обычно его гораздо легче читать (по крайней мере, для меня). Пример:

PCRE version 8.30-PT1 2012-01-01

  re> /ab|c[de]/iB
------------------------------------------------------------------
  0   7 Bra
  3  /i ab
  7  38 Alt
 10  /i c
 12     [DEde]
 45  45 Ket
 48     End
------------------------------------------------------------------

Я отлаживаю свои регулярные выражения своими глазами. Вот почему я использую /x Модификатор, пишите комментарии к ним и разбивайте их на части. Прочитайте Джеффри Фридла " Освоение регулярных выражений", чтобы узнать, как разрабатывать быстрые и удобочитаемые регулярные выражения. Различные инструменты отладки регулярных выражений просто провоцируют программирование вуду.

Я использую:

http://regexlib.com/RETester.aspx

Вы также можете попробовать Regex Hero (использует Silverlight):

http://regexhero.net/tester/

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

Если вы пользователь Mac, я только что столкнулся с этим:

http://atastypixel.com/blog/reginald-regex-explorer/

Это бесплатно и просто в использовании, и мне было очень полезно разобраться с RegEx в целом.

Я часто использую pcretest - вряд ли это "отладчик", но он работает только по текстовому SSH-соединению и анализирует именно тот диалект regex, который мне нужен: мой (C++) код ссылается на libpcre, так что нет никаких трудностей с тонкими различиями в том, что магия и что нет и т. д.

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

Я часто использую тестер регулярных выражений Ruby Rubular

а также в Emacs использовать Mx Re-Builder

Firefox также имеет полезное расширение

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

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

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

Я использую Rx Toolkit, включенный в ActiveState Komodo.

Вы можете попробовать это http://www.pagecolumn.com/tool/regtest.htm

Для меня, после того, как я присмотрел регулярное выражение (поскольку я довольно бегло и почти всегда использую /x или эквивалентный), я мог бы отлаживать, а не проверять, если я не уверен, что столкнусь с каким-нибудь вырожденным соответствием (то есть что-то, что чрезмерно возвращает назад) чтобы посмотреть, смогу ли я решить такие проблемы, например, изменив жадность оператора.

Чтобы сделать это, я бы использовал один из методов, упомянутых выше: pcretest, RegexBuddy (если мое текущее рабочее место лицензировало его) или аналогичный, и иногда я определяю время в Linqpad, если я работаю в регулярных выражениях C#.

(Перл-трюк для меня новый, поэтому, вероятно, добавлю это и в мой инструментарий регулярных выражений.)

Другие вопросы по тегам