Як ви налагодите регекс? [зачинено]


149

Регулярні вирази можуть стати досить складними. Брак білого простору ускладнює їх читання. Я не можу перейти через звичайний вираз з налагоджувачем. Тож як експерти налагоджують складні регулярні вирази?


2
Я вважаю, що "тестувати" ваш регулярний вираз набагато важливіше, ніж "налагоджувати" його. Зазвичай ви можете зрозуміти, що відбувається з регулярним виразом, досить легко дивлячись на результат (або використовуючи один із інструментів, запропонованих у відповідях), але щоб бути впевненим, він робить те, що ви маєте на увазі, ви повинні перевірити свій регекс з усіма можливими межами. Тестування з часом уточнить, що ви дійсно хочете зробити, і зробить налагодження марним :)
baol

7
Це здається цікавим: http://www.debuggex.com/ (Оскільки питання закрите, я не можу додати реальної відповіді.)
KajMagnus

Якщо у вас є Visual Studio, ви можете встановити точку перерви біля своєї проблемної області (наприклад:, RegEx.Replace(...)переключитися на "Негайне вікно" та спробувати кілька 'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)команд, щоб швидко нуль у проблемі.
DeepSpace101,

2
Я дуже здивований, схоже, ніхто не згадав regex101.com, у якого є власне налагоджувач, а також розміщений веб-сайт.
mechalynx

1
навіть у 2017 році я вважаю, що регексбудді все ще є найкращим інструментом, який я можу знайти, і ціна залишається на рівні 40 доларів. Я часто працюю на різних мовах з різним смаком регексу, тому часто плутаюсь. Що стосується regexbuddy, це просто звільняє мене від синтаксису
code4j

Відповіді:


68

Ви купуєте RegexBuddy і використовуєте його вбудовану функцію налагодження . Якщо ви працюєте з регулярними гексами більше двох разів на рік, ви повернете ці гроші назад, заощаджені в найкоротші терміни. RegexBuddy також допоможе вам створити прості і складні регулярні вирази і навіть генерувати код для вас на різних мовах.

alt текст

Також, за словами розробника, цей інструмент працює майже бездоганно в Linux під час використання з WINE .


31
Шкода, що це лише для Windows і коштує 40 доларів США.
kennytm

25
За словами розробника: regexbuddy.com/wine.html працює на Linux через WINE . А щодо вартості 40 доларів… скільки коштує ваш час?
Мік

18
Це не безкоштовне програмне забезпечення.
кодолік

38
Хто сказав, що це було чи просив?
Тім Піцкер

21
Ну, як сказав Мік, скільки коштує ваш час? "Кращі інструменти, які можна придбати", не завжди коштують грошей, але іноді вони є. Крім того , JGSoft послідовно розвиває велику якість продукції з винятковим сервісом користувача. Я навіть купував у них програмне забезпечення, яке мені не дуже потрібно (як RegexMagic), тому що я хотів би підтримати їх і підтримувати їх у бізнесі. Ви не знаєте, чого вам не вистачає. Серйозно.
Тім Піцкер

52

З Perl 5.10 use re 'debug';. (Або debugcolorя не можу правильно відформатувати вихід у стеку переповнення.)

$ perl -Mre = налагодження -e '"foobar" = ~ / (.) \ 1 /'
Компіляція REx "(.) \ 1"
Підсумкова програма:
   1: OPEN1 (3)
   3: REG_ANY (4)
   4: ЗАКРИТИ1 (6)
   6: REF1 (8)
   8: END (0)
хліб 1
Відповідність REx "(.) \ 1" проти "foobar"
   0 <> <foobar> | 1: OPEN1 (3)
   0 <> <foobar> | 3: REG_ANY (4)
   1 <f> <ообар> | 4: ЗАКРИТИ1 (6)
   1 <f> <ообар> | 6: REF1 (8)
                                  не вдалося ...
   1 <f> <ообар> | 1: OPEN1 (3)
   1 <f> <ообар> | 3: REG_ANY (4)
   2 <fo> <obar> | 4: ЗАКРИТИ1 (6)
   2 <fo> <obar> | 6: REF1 (8)
   3 <foo> <bar> | 8: END (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", ...);

12
+1: Чому хтось віддасть перевагу Regexbuddy цьому?
Чарльз Стюарт

1
Мені подобається цей метод, навіть хоча я думаю, що регулярно вийшов друг.
грак

відлуння "foobar" | egrep "(.) \ 1"
Дмитро Сандалов

30

Я додам ще одну, щоб я не забув цього: налагодження

Це добре, тому що це дуже візуально: Фото помічника Regex Debuggex


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

28

Коли я застрягаю на регулярному виразі, я зазвичай звертаюся до цього: https://regexr.com/

Ідеально підходить для швидкого тестування, де щось йде не так.


1
Цей інструмент дуже корисний: він розміщений в Інтернеті, тому його не встановлюють, це в реальному часі, тому налагодження - це мрія, і він навіть має корисні підказки та список спеціальних символів, якщо ви не можете щось запам'ятати. Це ідеально, дякую багато
Джейсон Райдж

На жаль, цей інструмент (досі) не дозволяє змінювати розділювачі регулярних виразів (навіть для двигуна PCRE) - вони фіксуються як /(косі риски). Це шоустоппер для мене.
MrWhite

19

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

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

(...)

alt текст

Працює в Linux, Unix, Windows, Mac.


2
Kodos не забезпечує справжніх функцій налагодження. Ви не можете переходити до регулярного вираження і не призупиняти виконання.
кандида

Якісь поради щодо його роботи на Mac? Сайт Sourceforge не пропонує ніякої інформації про встановлення для Mac, а мій Google-fu, здається, не вдається.
Адам Паркін

Хоча, здається, це Python2, і не оновлювався з 2006 року (14 років тому на момент написання)?
MrWhite

13

Я думаю, що цього не роблять. Якщо ваш regexp занадто складний і проблематичний до того, що вам потрібен налагоджувач, вам слід створити певний аналізатор або скористатися іншим методом. Це буде набагато легше читати і ремонтувати.


4
Чувак, ти це опублікував, подивившись знімок екрана regexbuddy?
грак

2
Всі з цим не погоджуються, але це не погана ідея. Усі припускають, що двигун регулярного випромінювання є найбільш ефективним із величезними регулярними виразами. Це не обов'язково правда, і їх точно неможливо прочитати. Розбийте свої реджекси.
Дан Розенстарк

1
@Michael Brooks: Ні, раніше, насправді. Подивившись скріншот, я добре з тим, що ви МОЖЕТЕ налагоджувати регулярний вираз. Але я стою на своїй ідеї: коли регулярний вираз стає занадто складним, настав час перейти на інший шлях.
Валентин Рочер

12

Є чудовий безкоштовний інструмент, тренер Regex . Остання версія доступна лише для Windows; його автор доктор Едмунд Вайц припинив підтримувати версію Linux, оскільки її завантажило занадто мало людей, але на сторінці завантаження є старша версія для Linux.


8

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

Доступний у CPAN безкоштовно: http://search.cpan.org/~dconway/Regexp-Debugger/lib/Regexp/Debugger.pm


ОП сказав: "Я не можу перейти через звичайний вираз з налагоджувачем".
квантовий

Чи є у вас посилання на презентацію?
грак

3
@Rook, ви можете переглянути презентацію на youtube.com/watch?v=zcSFIUiMgAs
Starfish


6

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


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
------------------------------------------------------------------





2

Написання reg reges за допомогою позначення типу PCRE - це як написання асемблера: це добре, якщо ви можете просто побачити відповідні автомати з кінцевим станом у вашій голові, але це може бути важко підтримувати дуже швидко.

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

Більш рефлексивний спосіб - використовувати представлення даних для генерації регулярних виразів у вашій мові програмування та мати відповідні абстракції для їх побудови. Вступ Оліна Шивера до його схеми noge regexp дає чудовий огляд проблем, з якими стикаються при розробці цих представлень даних.


Parser комбінатори дійсно дивовижний шлях: Парсек і PArrows в Haskell, rsec в Ruby, Підвищіть Дух в C ++, Pyparsing в Python, Perl6 :: правил в Perl і т.д.
ephemient

2

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

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





0

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

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

(Трюк perl - це новий для мене, тому, ймовірно, додасть це і до мого інструментарію для регексу.)

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.