2009-07-16 31 views
5

Chociaż istnieje wiele dobrych narzędzi online i offline do testowania wyrażeń regularnych, muszę jeszcze znaleźć narzędzie (oprócz RegexBuddy), które pozwala mi zobaczyć kroki, jakie wykonuje silnik wyrażeń regularnych, aby znaleźć dopasowanie (lub stwierdzić, że istnieje bez dopasowania, o to chodzi.)Jakie narzędzia służą do debugowania/przechodzenia przez wyrażenie regularne?

Czy ktoś wie o jakichkolwiek narzędziach, które to robią? Powodem, dla którego początkowo wykluczyłem RegexBuddy jest to, że jest komercyjne i wolałbym przejrzeć moje opcje, zanim zdecyduję się za to zapłacić.

Aby uczynić go bardziej zrozumiałym, co chcę, tutaj znajduje się zrzut ekranu z RegexBuddy (z ich strony głównej): http://img166.imageshack.us/img166/1272/debug.png

+1

Zrzut ekranu zniknął. –

Odpowiedz

1

Może RegexCoach oferuje to, czego szukasz ...

http://weitz.de/regex-coach/

+0

Dzięki, ale już mam zainstalowany RegexCoach. Ma prostą funkcjonalność krok po kroku, ale bardzo trudno jest porównywać występy między różnymi wyrażeniami regularnymi, które go używają. Ponadto nie obsługuje niektórych rozszerzeń wyrażeń regularnych dostępnych w środowisku PCRE. – Blixt

-1

To prawdopodobnie dlatego, że nie powinno mieć znaczenia, jak silnik regex znajdzie dopasowanie. Zrzut ekranu programu RegexBuddy sprawia, że ​​chcę użyć innego narzędzia dopasowującego do regexp, ponieważ nie powinno być potrzeby cofania.

Normalnie można przetłumaczyć wyrażenie regularne na nondeterministic finite automaton (NFA) lub deterministic finite automaton (DFA), które mogą obsługiwać wyrażenia regularne bez cofania.

Zgodnie z tym, jedynym wolnym narzędziem do tworzenia i testowania wyrażeń regularnych, które znam, jest pyreb.

+0

Tak, widziałem kilka przykładów tego (http: // osteele.com/tools/reanimator /), ale jeśli utknąłem na, powiedzmy, PCRE, to chciałbym być w stanie upewnić się, że nie przeoczę czegoś, co wprawia je w ekscytację w backtrackingu. – Blixt

+0

Dobra, po przeczytaniu http://www.codinghorror.com/blog/archives/000488.html wygląda na to, że silniki regexp rzeczywiście używają funkcji backtracking, głównie do obsługi grup. Przepraszam za mój zwodniczy post. – Bluehorn

+0

Tak, właśnie tego staram się uniknąć =) – Blixt

2

To nie jest tak potężny jak RegexBuddy, ale jest to prosty interfejs online: http://www.gskinner.com/RegExr/

Można myszą części swojej wypowiedzi i powie to, co robi. Bardzo prosty, ale może naprawdę zaoszczędzić czas, gdy robisz coś głupiego.

4

W Perl zawsze można po prostu use re 'debug'; lub use re 'debugcolor';

Na przykład, jeśli wpiszesz ten w Perlu:

use strict; 
use warnings; 
use 5.010; 
use re 'debug'; 

# using the same strings as the question's image for reference: 

my $str = 'Even if I do say so myself: "RegexBuddy is awesome"'; 
$str =~ /(Regexp?Buddy is (awful|acceptable|awesome))/; 

To jest to, co można dostać się:

Compiling REx "(Regexp?Buddy is (awful|acceptable|awesome))" 
Final program: 
    1: OPEN1 (3) 
    3: EXACT <Regex> (6) 
    6: CURLY {0,1} (10) 
    8:  EXACT <p> (0) 
    10: EXACT <Buddy is > (14) 
    14: OPEN2 (16) 
    16:  EXACT <a> (18) 
    18:  TRIEC-EXACT[cw] (29) # this is a new feature in Perl 5.10 
      <wful> 
      <cceptable> 
      <wesome> 
    29: CLOSE2 (31) 
    31: CLOSE1 (33) 
    33: END (0) 

anchored "Regex" at 0 floating "Buddy is a" at 5..6 (checking floating) minlen 19 
Guessing start of match in sv for REx "(Regexp?Buddy is (awful|acceptable|awesome))" against 'Even if I do say so myself: "RegexBuddy is awesome"' 
Found floating substr "Buddy is a" at offset 34... 
Found anchored substr "Regex" at offset 29... 
Starting position does not contradict # /^/m... 
Guessed: match at offset 29 

Matching REx "(Regexp?Buddy is (awful|acceptable|awesome))" against 'RegexBuddy is awesome"' 
    29 <'lf: "'> <RegexBuddy> | 1:OPEN1(3) 
    29 <'lf: "'> <RegexBuddy> | 3:EXACT <Regex>(6) 
    34 <Regex> <Buddy is a> | 6:CURLY {0,1}(10) 
            EXACT <p> can match 0 times out of 1... 
    34 <Regex> <Buddy is a> | 10: EXACT <Buddy is >(14) 
    43 <y is > <'awesome"'> | 14: OPEN2(16) 
    43 <y is > <'awesome"'> | 16: EXACT <a>(18) 
    44 < is a> <'wesome"'>  | 18: TRIEC-EXACT[cw](29) 
    44 < is a> <'wesome"'>  |  State: 2 Accepted: 0 Charid: 2 CP: 77 After State: 3 
    45 < is aw> <'esome"'>  |  State: 3 Accepted: 0 Charid: 7 CP: 65 After State: 10 
    46 < is awe> <'some"'>  |  State: 10 Accepted: 0 Charid: b CP: 73 After State: 11 
    47 < is awes> <'ome"'>  |  State: 11 Accepted: 0 Charid: c CP: 6f After State: 12 
    48 < is aweso> <'me"'>  |  State: 12 Accepted: 0 Charid: d CP: 6d After State: 13 
    49 < is awesom> <'e"'>  |  State: 13 Accepted: 0 Charid: 7 CP: 65 After State: 14 
    50 < is awesome> <'"'>  |  State: 14 Accepted: 1 Charid: 3 CP: 0 After State: 0 
            got 1 possible matches 
            only one match left: #3 <wesome> 
    50 < is awesome> <'"'>  | 29: CLOSE2(31) 
    50 < is awesome> <'"'>  | 31: CLOSE1(33) 
    50 < is awesome> <'"'>  | 33: END(0) 
Match successful! 
Freeing REx: "(Regexp?Buddy is (awful|acceptable|awesome))" 

(Uwaga : Zmieniłem niektóre części wyjścia, tak aby lepiej podkreślały)

1

Debuggex ma najlepsze podejście graficzne, jakie widziałem. Pokazuje on po prostu, jak powinien wyglądać diagram DFA dla danego wyrażenia regularnego, ma podstawowe podświetlanie w dopasowaniu i ma suwak u dołu, który pozwala krok po kroku przejść przez diagram DFA krok po kroku:

enter image description here