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


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

21 142

21 ответ:

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

alt text

кроме того, по словам разработчика, этот инструмент работает почти безупречно на Linux при использовании с Вино.

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

$ perl -Mre=debug -e'"foobar"=~/(.)/'
Compiling REx "(.)"
Final program:
   1: OPEN1 (3)
   3:   REG_ANY (4)
   4: CLOSE1 (6)
   6: REF1 (8)
   8: END (0)
minlen 1
Matching REx "(.)" against "foobar"
   0 <> <foobar>             |  1:OPEN1(3)
   0 <> <foobar>             |  3:REG_ANY(4)
   1 <f> <oobar>             |  4:CLOSE1(6)
   1 <f> <oobar>             |  6:REF1(8)
                                  failed...
   1 <f> <oobar>             |  1:OPEN1(3)
   1 <f> <oobar>             |  3:REG_ANY(4)
   2 <fo> <obar>             |  4:CLOSE1(6)
   2 <fo> <obar>             |  6:REF1(8)
   3 <foo> <bar>             |  8:END(0)
Match successful!
Freeing REx: "(.)"

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

"foobar" =~ /
    (.)  # any character, followed by a
       # 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", ...);

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

Это хорошо, потому что это очень визуальный: Photo of the Debuggex regex helper

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

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

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

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

(...)

alt текст http://kodos.sourceforge.net/images/match.gif

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

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

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

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

доступно на CPAN для бесплатный: http://search.cpan.org/~dconway/Регулярное_выражение-отладчик/Либ/регулярное выражение/отладчик.ПМ

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

http://www.regextester.com/

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

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

Что касается меня, я обычно использую утилиту 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
------------------------------------------------------------------

Я использую:

http://regexlib.com/RETester.aspx

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

http://regexhero.net/tester/

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

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

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

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

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

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

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

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

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

Я часто использую Ruby на основе regexp tester Rubular

, а также в Emacs использовать M-xre-builder

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

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

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

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

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

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