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

149

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

ладья
источник
2
Я считаю, что «тестирование» вашего регулярного выражения гораздо важнее, чем его «отладка». Обычно вы можете легко понять, что происходит с регулярным выражением, глядя на результат (или используя один из инструментов, предложенных в ответах), но чтобы быть действительно уверенным, что оно соответствует вашим ожиданиям, вы должны проверить свое регулярное выражение со всеми возможными случаями границ. В конечном итоге тестирование прояснит, что вы действительно хотите сделать, и сделает отладку бесполезной :)
baol
7
Это кажется интересным: http://www.debuggex.com/ (Так как вопрос закрыт, я не могу добавить реальный ответ.)
KajMagnus
Если у вас есть Visual Studio, вы можете установить точку останова рядом с проблемной областью (например RegEx.Replace(...), переключиться на «Немедленное окно» и попробовать несколько 'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)команд, чтобы быстро обнулить проблему.
DeepSpace101
2
Я очень удивлен, что никто, по-видимому, не упомянул regex101.com, у которого есть настоящий отладчик и который также размещен в сети.
mechalynx
1
даже в 2017 году я считаю, что regexbuddy по-прежнему лучший инструмент, который я могу найти, и цена остается на уровне 40 долларов. Я часто работаю на разных языках с разным вкусом регулярных выражений, поэтому часто путаюсь. С помощью regexbuddy это просто освобождает меня от синтаксиса
code4j

Ответы:

68

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

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

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

Мик
источник
31
Жаль, что это только для Windows и стоит 40 долларов США.
Kennytm
25
По словам разработчика, он работает в Linux через WINE: regexbuddy.com/wine.html . И о стоимости 40 долларов ... сколько стоит ваше время?
Мик
18
Это не свободное программное обеспечение.
Codeholic
38
Кто сказал, что это было или просили об этом?
Тим Пицкер
21
Ну, как сказал Мик, сколько стоит твое время? «Лучшие инструменты, которые можно купить за деньги», не всегда должны стоить денег, но иногда они стоят. Кроме того, JGSoft постоянно разрабатывает продукты отличного качества с исключительным обслуживанием пользователей. Я даже купил у них программное обеспечение, которое мне действительно не нужно (например, RegexMagic), потому что я хотел бы поддержать их и поддерживать в бизнесе. Вы не знаете, что вам не хватает. Шутки в сторону.
Тим Пицкер
52

С 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 <> <foobar> | 1: OPEN1 (3)
   0 <> <foobar> | 3: REG_ANY (4)
   1 <f> <oobar> | 4: CLOSE1 (6)
   1 <f> <oobar> | 6: REF1 (8)
                                  не смогли...
   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: КОНЕЦ (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", ...);
ephemient
источник
12
+1: Почему кто-то предпочел бы Regexbuddy этому?
Чарльз Стюарт
1
Мне нравится этот метод, хотя я думаю, что регулярные выражения лучше.
ладья
эхо "foobar" | egrep "(.) \ 1"
DmitrySandalov
30

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

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

Кевин
источник
debuggex на самом деле не работает для меня: шрифты, по-видимому, навязаны JavaScript и не работают (у меня есть моноширинные шрифты, консоль Firefox использует их отлично). Как следствие, дисплей непригоден для использования. Кроме того, при тестировании JavaScript браузер содержит множество тестовых примеров для каждой редакции (не только один раз при запуске). Наконец, некоторые из предложенных регулярных выражений содержат ошибки и не совпадают по назначению.
7heo.tk
28

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

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

thetaiko
источник
1
Этот инструмент действительно полезен: он размещен в Интернете, поэтому его не нужно устанавливать, он работает в режиме реального времени, поэтому отладка - это мечта, и в нем даже есть полезные всплывающие подсказки и список специальных символов, если вы что-то не можете вспомнить. Это прекрасно, спасибо большое
Джейсон Ридж
К сожалению, этот инструмент (до сих пор) не позволяет изменять разделители регулярных выражений (даже для механизма PCRE) - они фиксируются как /(косая черта). Это шоу для меня.
MrWhite
19

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

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

(...)

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

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

Паскаль Тивент
источник
2
Кодос не предоставляет истинных функций отладки. Вы не можете ни шагнуть в регулярное выражение, ни приостановить выполнение.
Candide
Любые советы, как заставить его работать на Mac? Сайт Sourceforge не предлагает никакой информации об установке для Mac, и мой Google-fu, кажется, подводит меня.
Адам Паркин
Хотя может показаться, что это Python2, и он не обновлялся с 2006 года (14 лет назад на момент написания статьи)?
MrWhite
13

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

Валентин Роше
источник
4
Чувак, ты опубликовал это после того, как посмотрел снимок экрана regexbuddy?
Ладья
2
Все с этим не согласятся, но это неплохая идея. Все предполагают, что механизм регулярных выражений наиболее эффективен с огромными регулярными выражениями. Это не обязательно так, и их определенно нелегко читать. Разбейте свои регулярные выражения.
Дэн Розенстарк
1
@ Майкл Брукс: Нет, раньше, на самом деле. Увидев скриншот, я согласен с тем, что вы МОЖЕТЕ отладить регулярное выражение. Но я придерживаюсь своей идеи: когда регулярное выражение становится слишком сложным, пора перейти на другой путь.
Валентин Роше
12

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

APC
источник
8

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

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

Ив
источник
OP сказал: «Я не могу перейти через регулярное выражение с помощью отладчика».
Квантовая
У вас есть ссылка на презентацию?
Ладья
3
@Rook, Вы можете просмотреть презентацию на youtube.com/watch?v=zcSFIUiMgAs
Starfish,
7

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

https://www.regextester.com/

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

GFE
источник
Это может показаться идентичным regexpal.com
MrWhite
6

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

codeholic
источник
5

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

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

eggsyntax
источник
3

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

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

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

jayp
источник
2

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

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

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

Чарльз Стюарт
источник
Комбинаторы парсеров - действительно замечательный путь: Parsec и PArrows в Haskell, rsec в Ruby, Boost Spirit в C ++, PyParsing в Python, Perl6 :: Rules в Perl и т. Д.
ephemient
2

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

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

Бернд Джендриссек
источник
0

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

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

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

ChrisF
источник