Jak debugować wyrażenie regularne? [Zamknięte]

149

Wyrażenia regularne mogą stać się dość złożone. Brak spacji utrudnia ich odczytanie. Nie mogę przejść przez wyrażenie regularne z debugerem. Jak więc eksperci debugują złożone wyrażenia regularne?

wieża
źródło
2
Uważam, że „testowanie” wyrażenia regularnego jest znacznie ważniejsze niż „debugowanie” go. Zwykle możesz łatwo zorientować się, co się dzieje z wyrażeniem regularnym, patrząc na wynik (lub używając jednego z narzędzi sugerowanych w odpowiedziach), ale aby być naprawdę pewnym, że robi to, co masz na myśli, powinieneś przetestować swoje wyrażenie regularne we wszystkich możliwych przypadkach granicznych. Testowanie ostatecznie wyjaśni, co naprawdę chcesz zrobić, i sprawi, że debugowanie będzie bezużyteczne :)
baol
7
Wydaje się to interesujące: http://www.debuggex.com/ (Ponieważ pytanie jest zamknięte, nie mogę dodać prawdziwej odpowiedzi.)
KajMagnus
Jeśli masz program Visual Studio, możesz ustawić punkt przerwania w pobliżu obszaru, w którym występuje problem (np .: RegEx.Replace(...)przełącz się na „Okno bezpośrednie” i wypróbuj kilka 'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)poleceń, aby szybko
zerować
2
Jestem bardzo zaskoczony, że nikt nie wspomniał o regex101.com, która ma rzeczywisty debugger i jest również hostowana w Internecie.
mechalynx
1
nawet w 2017 roku uważam, że regexbuddy jest nadal najlepszym narzędziem, jakie mogę znaleźć, a cena pozostaje na poziomie 40 USD. Często pracuję nad różnymi językami z różnymi smakami regex, więc często się mylę. Dzięki regexbuddy po prostu uwalnia mnie od składni
code4j

Odpowiedzi:

68

Kupujesz RegexBuddy i korzystasz z wbudowanej funkcji debugowania . Jeśli pracujesz z wyrażeniami regularnymi więcej niż dwa razy w roku, w mgnieniu oka odzyskasz te pieniądze w zaoszczędzonym czasie. RegexBuddy pomoże Ci również tworzyć proste i złożone wyrażenia regularne, a nawet wygenerować kod w różnych językach.

tekst alternatywny

Ponadto, według autora, narzędzie to działa prawie bezbłędnie w systemie Linux, gdy jest używane z WINE .

Mick
źródło
31
Szkoda, że ​​jest dostępny tylko dla systemu Windows i kosztuje 40 USD.
kennytm
25
Działa na Linuksie przez WINE, według autora: regexbuddy.com/wine.html . A jeśli chodzi o koszt 40 $ ... ile wart jest twój czas?
Mick,
18
To nie jest wolne oprogramowanie.
codeholic,
38
Kto powiedział, że tak było lub o to prosił?
Tim Pietzcker
21
Cóż, jak powiedział Mick, ile wart jest twój czas? „Najlepsze narzędzia, jakie można kupić za pieniądze” nie zawsze muszą kosztować, ale czasami tak jest. Ponadto JGSoft konsekwentnie opracowuje produkty doskonałej jakości z wyjątkową obsługą użytkownika. Kupiłem nawet od nich oprogramowanie, którego tak naprawdę nie potrzebuję (jak RegexMagic), ponieważ chciałbym ich wspierać i utrzymać w biznesie. Nie wiesz, czego tracisz. Poważnie.
Tim Pietzcker
52

Z Perl 5.10 use re 'debug';. (Lub debugcolor, ale nie mogę poprawnie sformatować danych wyjściowych w przypadku przepełnienia stosu).

$ perl -Mre = debuguj -e '"foobar" = ~ / (.) \ 1 /'
Kompilowanie REx "(.) \ 1"
Program końcowy:
   1: OTWARTE 1 (3)
   3: REG_ANY (4)
   4: ZAMKNIJ1 (6)
   6: REF1 (8)
   8: KONIEC (0)
minlen 1
Dopasowanie REx "(.) \ 1" do "foobar"
   0 <> <foobar> | 1: OTWARTE 1 (3)
   0 <> <foobar> | 3: REG_ANY (4)
   1 <f> <oobar> | 4: ZAMKNIJ1 (6)
   1 <f> <oobar> | 6: REF1 (8)
                                  nie powiodło się ...
   1 <f> <oobar> | 1: OTWARTE 1 (3)
   1 <f> <oobar> | 3: REG_ANY (4)
   2 <fo> <obar> | 4: ZAMKNIJ1 (6)
   2 <fo> <obar> | 6: REF1 (8)
   3 <foo> <bar> | 8: KONIEC (0)
Mecz udany!
Uwalnianie REx: „(.) \ 1”

Ponadto, można dodać białe znaki i komentarze do regexes, aby były bardziej czytelne. W Perlu odbywa się to za pomocą /xmodyfikatora. Ze pcreistnieje PCRE_EXTENDEDflaga.

"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
źródło
12
+1: Dlaczego ktoś wolałby Regexbuddy od tego?
Charles Stewart
1
Podoba mi się ta metoda, chociaż uważam, że kolega regex jest lepszy.
wieża
echo "foobar" | egrep "(.) \ 1"
DmitrySandalov
30

Dodam jeszcze jeden, żeby go nie zapomnieć: debuggex

To jest dobre, ponieważ jest bardzo wizualne: Zdjęcie pomocnika wyrażeń regularnych Debuggex

kevin
źródło
debuggex właściwie nie działa dla mnie: czcionki są najwyraźniej wymuszane przez JavaScript i nie działają (mam czcionki o stałej szerokości, konsola Firefox doskonale ich używa). W konsekwencji wyświetlacz jest bezużyteczny. Ponadto testowanie JavaScript zawiesza przeglądarkę z wieloma przypadkami testowymi dla każdej edycji (nie tylko raz po uruchomieniu). Wreszcie, niektóre z proponowanych wyrażeń regularnych są błędne i nie pasują zgodnie z zamierzeniami.
7heo.tk
28

Kiedy utknę na wyrażeniu regularnym, zwykle przechodzę do tego: https://regexr.com/

Jest idealny do szybkiego testowania, gdy coś jest nie tak.

thetaiko
źródło
1
To narzędzie jest naprawdę przydatne: jest hostowane w sieci, więc nie wymaga instalacji, jest w czasie rzeczywistym, więc debugowanie jest marzeniem, a nawet ma przydatne wskazówki i listę znaków specjalnych, na wypadek, gdybyś czegoś nie pamiętał. Jest doskonały, wielkie dzięki
Jason Ridge
Niestety, to narzędzie (nadal) nie pozwala na zmianę ograniczników wyrażeń regularnych (nawet dla silnika PCRE) - są one naprawione jako /(ukośniki). To jest dla mnie showstopper.
MrWhite
19

Używam Kodos - Debuggera wyrażeń regularnych Pythona:

Kodos to narzędzie GUI w języku Python do tworzenia, testowania i debugowania wyrażeń regularnych dla języka programowania Python. Kodos powinien pomóc każdemu programiście w wydajnym i łatwym tworzeniu wyrażeń regularnych w Pythonie. Ponieważ implementacja wyrażeń regularnych w Pythonie jest oparta na standardzie PCRE , Kodos powinien przynosić korzyści programistom korzystającym z innych języków programowania, które również są zgodne ze standardem PCRE (Perl, PHP itp.).

(...)

tekst alternatywny

Działa na systemach Linux, Unix, Windows, Mac.

Pascal Thivent
źródło
2
Kodos nie zapewnia prawdziwych funkcji debugowania. Nie możesz przejść do wyrażenia regularnego ani wstrzymać wykonywania.
kandydat
Jakieś wskazówki, jak to działa na komputerze Mac? Witryna Sourceforge nie oferuje żadnych informacji na temat instalacji na Maca, a moje Google-fu wydaje mi się zawodzić.
Adam Parkin,
Chociaż wydaje się, że to Python2 i nie był aktualizowany od 2006 roku (14 lat temu w momencie pisania)?
MrWhite
13

Myślę, że nie. Jeśli Twoje wyrażenie regularne jest zbyt skomplikowane i problematyczne do tego stopnia, że ​​potrzebujesz debuggera, powinieneś utworzyć określony parser lub użyć innej metody. Będzie znacznie bardziej czytelny i łatwiejszy w utrzymaniu.

Valentin Rocher
źródło
4
Koleś, opublikowałeś to po obejrzeniu zrzutu ekranu regexbuddy?
wieża
2
Wszyscy się z tym nie zgodzą, ale to nie jest zły pomysł. Wszyscy zakładają, że silnik regex jest najbardziej wydajny z ogromnymi wyrażeniami regularnymi. Niekoniecznie jest to prawda i na pewno nie są one łatwe do odczytania. Przełam swoje wyrażenia regularne.
Dan Rosenstark
1
@Michael Brooks: Właściwie to nie wcześniej. Widząc zrzut ekranu, nie przeszkadza mi fakt, że MOŻESZ debugować wyrażenie regularne. Ale stoję na swoim pomyśle: kiedy wyrażenie regularne staje się zbyt skomplikowane, czas zmienić sposób.
Valentin Rocher,
12

Istnieje doskonałe darmowe narzędzie Regex Coach . Najnowsza wersja jest dostępna tylko dla systemu Windows; jego autor, dr Edmund Weitz, przestał utrzymywać wersję Linuksa, ponieważ pobrało ją zbyt mało osób, ale na stronie pobierania znajduje się starsza wersja dla Linuksa.

APC
źródło
8

Właśnie zobaczyłem prezentację Regexp :: Debugger autorstwa jego twórcy: Damiana Conwaya. Bardzo imponujące rzeczy: uruchamianie w miejscu lub za pomocą narzędzia wiersza poleceń (rxrx), interaktywnie lub na "zalogowanym" pliku wykonawczym (przechowywanym w JSON), krok do przodu i do tyłu w dowolnym momencie, zatrzymywanie na punktach przerwania lub zdarzeniach, kolorowe wyjście (konfigurowalne przez użytkownika ), mapy cieplne na wyrażeniach regularnych i ciągach znaków w celu optymalizacji itp.

Dostępne bezpłatnie w CPAN: http://search.cpan.org/~dconway/Regexp-Debugger/lib/Regexp/Debugger.pm

Yves
źródło
OP powiedział: „Nie mogę przechodzić przez wyrażenie regularne za pomocą debugera”.
kwantowy
Czy masz link do prezentacji?
wieża
3
@Rook, Możesz obejrzeć prezentację na youtube.com/watch?v=zcSFIUiMgAs
Starfish
6

Debuguję moje wyrażenia regularne na własne oczy. Dlatego używam /xmodyfikatora, piszę do nich komentarze i dzielę je na części. Przeczytaj książkę Jeffrey Friedl Mastering Regular Expressions, aby dowiedzieć się, jak tworzyć szybkie i czytelne wyrażenia regularne. Różne narzędzia do debugowania regex po prostu prowokują programowanie voodoo.

codeholic
źródło
5

Jeśli chodzi o mnie, zwykle używam narzędzia pcretest, które może zrzucić kod bajtowy dowolnego wyrażenia regularnego i zwykle jest znacznie łatwiejsze do odczytania (przynajmniej dla mnie). Przykład:

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
------------------------------------------------------------------
ciemny 100
źródło
3

Jeśli czuję, że utknąłem, lubię cofać się i generować wyrażenie regularne bezpośrednio z przykładowego tekstu za pomocą txt2re (chociaż zwykle w końcu poprawiam wynikowy regex ręcznie).

eggsyntax
źródło
2

Pisanie reg exes przy użyciu notacji takiej jak PCRE jest jak pisanie asemblera: jest w porządku, jeśli widzisz w głowie odpowiadające mu automaty skończone, ale może to być trudne do bardzo szybkiego utrzymania.

Powody, dla których nie używasz debuggera są takie same, jak w przypadku nieużywania debugera z językiem programowania: możesz naprawić lokalne błędy, ale nie pomogą one w rozwiązaniu problemów projektowych, które doprowadziły do ​​popełnienia lokalnych błędów w pierwszym miejsce.

Bardziej refleksyjnym sposobem jest użycie reprezentacji danych do generowania wyrażeń regularnych w języku programowania i posiadanie odpowiednich abstrakcji do ich tworzenia. Wprowadzenie Olina Shivera do jego notacji wyrażeń regularnych schematu daje doskonały przegląd problemów napotykanych podczas projektowania tych reprezentacji danych.

Charles Stewart
źródło
Kombinatory parserów są rzeczywiście niesamowitym rozwiązaniem: Parsec and PArrows w Haskell, rsec w Ruby, Boost Spirit w C ++, PyParsing w Pythonie, Perl6 :: Rules in Perl itd.
ephemient
2

Często używam pcretest - nie jest to „debugger”, ale działa na połączeniach SSH zawierających tylko tekst i analizuje dokładnie dialekt wyrażenia regularnego, którego potrzebuję: mój kod (C ++) łączy się z libpcre, więc nie ma trudności z subtelnymi różnicami w tym, co jest magiczne i co nie jest itp.

Ogólnie zgadzam się z facetem powyżej, dla którego potrzeba debuggera wyrażeń regularnych to zapach kodu. Dla mnie najtrudniejsze w używaniu wyrażeń regularnych zwykle nie są same wyrażenia regularne, ale wiele warstw cytowania potrzebnych do ich działania.

Bernd Jendrissek
źródło
0

Dla mnie, po przejrzeniu wyrażenia regularnego (ponieważ jestem dość biegły i prawie zawsze używam / x lub odpowiednika), mógłbym debugować zamiast testować, jeśli nie jestem pewien, czy trafiłbym w jakieś zdegenerowane dopasowanie (tj. Coś, co nadmiernie się cofa) aby sprawdzić, czy uda mi się rozwiązać takie problemy, na przykład modyfikując zachłanność operatora.

Aby to zrobić, użyłbym jednej z wyżej wymienionych metod: pcretest, RegexBuddy (jeśli moje obecne miejsce pracy ma na to licencję) lub podobnej, a czasami mierzę czas w Linqpadzie, jeśli pracuję w regexach C #.

(Sztuczka z Perlem jest dla mnie nowa, więc prawdopodobnie dodam ją również do mojego zestawu narzędzi regex.)

ChrisF
źródło