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?
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.
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).
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",...);
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.
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.
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.).
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.
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.
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.
Wydawałoby się, że jest to identyczne z regexpal.com
MrWhite
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.
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
------------------------------------------------------------------07Bra3/i ab
738Alt10/i c
12[DEde]4545Ket48End------------------------------------------------------------------
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).
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.
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.
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.)
RegEx.Replace(...)
przełącz się na „Okno bezpośrednie” i wypróbuj kilka'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)
poleceń, aby szybkoOdpowiedzi:
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.
Ponadto, według autora, narzędzie to działa prawie bezbłędnie w systemie Linux, gdy jest używane z WINE .
źródło
Z Perl 5.10
use re 'debug';
. (Lubdebugcolor
, ale nie mogę poprawnie sformatować danych wyjściowych w przypadku przepełnienia stosu).Ponadto, można dodać białe znaki i komentarze do regexes, aby były bardziej czytelne. W Perlu odbywa się to za pomocą
/x
modyfikatora. Zepcre
istniejePCRE_EXTENDED
flaga.źródło
Dodam jeszcze jeden, żeby go nie zapomnieć: debuggex
To jest dobre, ponieważ jest bardzo wizualne:
źródło
Kiedy utknę na wyrażeniu regularnym, zwykle przechodzę do tego: https://regexr.com/
Jest idealny do szybkiego testowania, gdy coś jest nie tak.
źródło
/
(ukośniki). To jest dla mnie showstopper.Używam Kodos - Debuggera wyrażeń regularnych Pythona:
Działa na systemach Linux, Unix, Windows, Mac.
źródło
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.
źródło
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.
źródło
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
źródło
Używam tego narzędzia online do debugowania mojego wyrażenia regularnego:
https://www.regextester.com/
Ale tak, to nie może pokonać RegexBuddy.
źródło
Debuguję moje wyrażenia regularne na własne oczy. Dlatego używam
/x
modyfikatora, 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.źródło
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:
źródło
Używam:
http://regexlib.com/RETester.aspx
Możesz także wypróbować Regex Hero (używa Silverlight):
http://regexhero.net/tester/
źródło
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).
źródło
Jeśli jesteś użytkownikiem Maca, właśnie natknąłem się na ten:
http://atastypixel.com/blog/reginald-regex-explorer/
Jest darmowy i prosty w użyciu, a także bardzo pomogło mi opanować ogólne wyrażenia regularne.
źródło
Spójrz na (niewolne) narzędzia na regular-expressions.info . W szczególności RegexBuddy . Oto post Jeffa Atwooda na ten temat .
źródło
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.
źródło
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.
źródło
Często używam testera regexp opartego na Rubim Rubular
a także w Emacsie użyj M-x re-builder
Firefox ma również przydatne rozszerzenie
źródło
Używam zestawu narzędzi Rx dołączonego do ActiveState Komodo .
źródło
Możesz wypróbować ten http://www.pagecolumn.com/tool/regtest.htm
źródło
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.)
źródło