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


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.