Как вы отлаживаете регулярное выражение?
Регулярные выражения могут стать довольно сложными. Отсутствие пробелов затрудняет их чтение. Я не могу сделать шаг, хотя регулярное выражение с отладчиком. Так как же эксперты отлаживают сложные регулярные выражения?
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
Это хорошо, потому что это очень наглядно:
Я использую Kodos - отладчик регулярных выражений Python:
Kodos - это утилита Python GUI для создания, тестирования и отладки регулярных выражений для языка программирования Python. Kodos должен помочь любому разработчику эффективно и без усилий разрабатывать регулярные выражения в Python. Поскольку реализация регулярных выражений в Python основана на стандарте PCRE, Kodos должен помочь разработчикам на других языках программирования, которые также придерживаются стандарта PCRE (Perl, PHP и т. Д.).
(...)
Работает на 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
Я использую этот онлайн-инструмент для отладки моего регулярного выражения:
Но да, это не может победить 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):
Если я чувствую себя застрявшим, мне нравится возвращаться назад и генерировать регулярное выражение непосредственно из образца текста, используя txt2re (хотя я обычно заканчиваю настройку полученного регулярного выражения вручную).
Если вы пользователь Mac, я только что столкнулся с этим:
http://atastypixel.com/blog/reginald-regex-explorer/
Это бесплатно и просто в использовании, и мне было очень полезно разобраться с RegEx в целом.
Я часто использую pcretest - вряд ли это "отладчик", но он работает только по текстовому SSH-соединению и анализирует именно тот диалект regex, который мне нужен: мой (C++) код ссылается на libpcre, так что нет никаких трудностей с тонкими различиями в том, что магия и что нет и т. д.
В общем, я согласен с парнем, для которого необходимость в отладчике регулярных выражений является запахом кода. Для меня самым сложным в использовании регулярных выражений обычно является не само регулярное выражение, а несколько уровней цитирования, необходимых для их работы.
Взгляните на (несвободные) инструменты на регулярном выражении. RegexBuddy, в частности. Вот пост Джеффа Этвуда на эту тему.
Я часто использую тестер регулярных выражений Ruby Rubular
а также в Emacs использовать Mx Re-Builder
Firefox также имеет полезное расширение
Написание регистров с использованием нотации, подобной PCRE, похоже на написание ассемблера: это хорошо, если вы можете просто видеть соответствующие конечные автоматы в своей голове, но поддерживать их очень быстро очень сложно.
Причины неиспользования отладчика такие же, как и при отсутствии отладчика с языком программирования: вы можете исправлять локальные ошибки, но они не помогут вам решить проблемы проектирования, которые привели к локальным ошибкам в первом место.
Более рефлексивный способ - использовать представления данных для генерации регулярных выражений в вашем языке программирования и иметь соответствующие абстракции для их построения. Введение Олина Шивера в нотацию регулярного выражения схемы дает превосходный обзор проблем, с которыми сталкиваются при проектировании этих представлений данных.
Вы можете попробовать это http://www.pagecolumn.com/tool/regtest.htm
Для меня, после того, как я присмотрел регулярное выражение (поскольку я довольно бегло и почти всегда использую /x или эквивалентный), я мог бы отлаживать, а не проверять, если я не уверен, что столкнусь с каким-нибудь вырожденным соответствием (то есть что-то, что чрезмерно возвращает назад) чтобы посмотреть, смогу ли я решить такие проблемы, например, изменив жадность оператора.
Чтобы сделать это, я бы использовал один из методов, упомянутых выше: pcretest, RegexBuddy (если мое текущее рабочее место лицензировало его) или аналогичный, и иногда я определяю время в Linqpad, если я работаю в регулярных выражениях C#.
(Перл-трюк для меня новый, поэтому, вероятно, добавлю это и в мой инструментарий регулярных выражений.)