2009-07-16 7 views
5

Während es viele gute Online- und Offline-Tools zum Testen regulärer Ausdrücke gibt, muss ich noch ein Tool finden (neben RegexBuddy), das mir die Schritte zeigt, die die Engine für reguläre Ausdrücke braucht, um eine Übereinstimmung zu finden (oder zu finden, dass es da ist keine Übereinstimmung, für die Angelegenheit.)Welche Werkzeuge gibt es zum Debuggen/Durchlaufen eines regulären Ausdrucks?

Kennt jemand irgendwelche Werkzeuge, die das tun? Der Grund, warum ich zuerst RegexBuddy ausgeschlossen habe, ist, weil es kommerziell ist und ich würde lieber über meine Optionen schauen, bevor ich mich entscheide, dafür zu bezahlen.

Um es klarer, was ich will, ist hier ein Screenshot von RegexBuddy ist (von ihrer Homepage): http://img166.imageshack.us/img166/1272/debug.png

+1

Der Screenshot ist verschwunden. –

Antwort

1

Vielleicht RegexCoach bietet das, was Sie suchen ...

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

+0

Danke, aber ich habe bereits RegexCoach installiert. Es verfügt über eine einfache Schritt-für-Schritt-Funktionalität, aber es ist sehr schwierig, die Leistung zwischen verschiedenen regulären Ausdrücken zu vergleichen. Außerdem werden bestimmte Erweiterungen für reguläre Ausdrücke, die in PCRE verfügbar sind, nicht unterstützt. – Blixt

-1

Das ist wahrscheinlich so, weil es egal ist, wie die Regex-Engine eine Übereinstimmung findet. Der Screenshot von RegexBuddy lässt mich einen anderen Regexp-Matcher verwenden, da kein Backtracking erforderlich ist.

Normalerweise würden Sie den regulären Ausdruck in nondeterministic finite automaton (NFA) oder deterministic finite automaton (DFA) übersetzen, die reguläre Ausdrücke ohne Backtracking verarbeiten können.

Das einzige kostenlose Tool zum Erstellen und Testen von regulären Ausdrücken, die ich kenne, ist pyreb.

+0

Ja, ich habe einige Beispiele dafür gesehen (http: // osteele.com/tools/reanimator /), aber wenn ich feststecke, sagen wir, PCRE, dann würde ich gerne in der Lage sein, sicherzustellen, dass ich nichts verpasse, das es in eine Backtracking-Extravaganz bringt. – Blixt

+0

Okay, nach dem Lesen von http://www.codinghorror.com/blog/archives/000488.html scheint es, dass Regexp-Engines tatsächlich Backtracking verwenden, hauptsächlich um Gruppen zu unterstützen. Entschuldigung für meinen irreführenden Beitrag. – Bluehorn

+0

Ja, genau das versuche ich zu vermeiden =) – Blixt

2

Es ist nicht ganz so mächtig wie RegexBuddy, aber es ist eine einfache Online-Schnittstelle: http://www.gskinner.com/RegExr/

Sie können Maus über Teile des Ausdrucks und es wird Ihnen sagen, was es tut. Sehr einfach, aber es kann wirklich Zeit sparen, wenn Sie etwas Dummes tun.

4

In Perl können Sie immer nur use re 'debug'; oder use re 'debugcolor';

Zum Beispiel, wenn Sie dies in Perl eingeben:

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))/; 

Dies ist, was Sie raus:

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

(Hinweis : Ich habe einige Teile der Ausgabe geändert, so dass es besser hervorheben würde)

1

Debuggex hat den besten grafischen Ansatz, den ich dort gesehen habe. Es zeigt Ihnen im Grunde, wie ein DFA Diagramm für den gegebenen regulären Ausdruck aussehen würde, hat grundlegende Hervorhebung für die Übereinstimmung und verfügt über einen Schieberegler unten, mit dem Sie Schritt für Schritt durch das Übereinstimmungs- und DFA-Diagramm gehen können:

enter image description here

Verwandte Themen