Come si esegue il debug di una regex? [chiuso]


149

Le espressioni regolari possono diventare piuttosto complesse. La mancanza di spazi bianchi li rende difficili da leggere. Non posso passare attraverso un'espressione regolare con un debugger. In che modo gli esperti eseguono il debug di espressioni regolari complesse?


2
Credo che "testare" il tuo regex sia molto più importante del "debug". Di solito puoi capire cosa sta succedendo con un regex abbastanza facilmente guardando il risultato (o usando uno degli strumenti suggeriti nelle risposte), ma per essere veramente sicuro che fa quello che vuoi dire dovresti testare il tuo regex con tutti i possibili casi limite. I test alla fine chiariranno cosa vuoi veramente fare e renderanno inutile il debug :)
baol

7
Questo sembra interessante: http://www.debuggex.com/ (poiché la domanda è chiusa, non posso aggiungere una risposta reale.)
KajMagnus

Se si dispone di Visual Studio, è possibile impostare un punto di interruzione vicino all'area del problema (ad esempio: RegEx.Replace(...)passare a 'Finestra immediata' e provare alcuni 'Regex.IsMatch(yourDebugInputString, yourDebugInputRegEx)comandi per azzerare rapidamente il problema.
DeepSpace101

2
Sono molto sorpreso che nessuno abbia menzionato regex101.com che ha un debugger reale ed è anche ospitato sul web.
mechalynx,

1
anche nel 2017, credo che regexbuddy sia ancora lo strumento migliore che posso trovare, e il prezzo rimane a $ 40. Lavoro spesso in diverse lingue con diversi sapori regex, quindi spesso mi confondo. Con regexbuddy, mi libera dalla sintassi
code4j,

Risposte:


68

Acquista RegexBuddy e utilizzi la sua funzionalità di debug integrata . Se lavori con regexes più di due volte all'anno, otterrai questi soldi indietro nel tempo risparmiati in pochissimo tempo. RegexBuddy ti aiuterà anche a creare espressioni regolari semplici e complesse e persino a generare il codice per te in una varietà di lingue.

testo alternativo

Inoltre, secondo lo sviluppatore, questo strumento funziona quasi perfettamente su Linux se usato con WINE .


31
Peccato che sia solo per Windows e costa $ 40.
kennytm,

25
Funziona su Linux tramite WINE, secondo lo sviluppatore: regexbuddy.com/wine.html . E circa il costo di $ 40 ... quanto vale il tuo tempo?
Mick,

18
Questo non è un software libero.
Alcolico

38
Chi l'ha detto o lo ha chiesto?
Tim Pietzcker,

21
Bene, come ha detto Mick, quanto vale il tuo tempo? "I migliori strumenti che il denaro può comprare" non devono sempre costare denaro, ma a volte lo fanno. Inoltre, JGSoft sviluppa costantemente prodotti di grande qualità con un servizio utente eccezionale. Ho persino comprato software da loro che non ho davvero bisogno (come RegexMagic) perché mi piacerebbe supportarli e mantenerli in attività. Non sai cosa ti stai perdendo. Sul serio.
Tim Pietzcker,

52

Con Perl 5.10, use re 'debug';. (Oppure debugcolor, ma non riesco a formattare correttamente l'output su Stack Overflow.)

$ perl -Mre = debug -e '"foobar" = ~ / (.) \ 1 /'
Compilare REx "(.) \ 1"
Programma finale:
   1: OPEN1 (3)
   3: REG_ANY (4)
   4: CLOSE1 (6)
   6: REF1 (8)
   8: END (0)
minlen 1
Corrispondenza di REx "(.) \ 1" contro "foobar"
   0 <> <foobar> | 1: aperta1 (3)
   0 <> <foobar> | 3: REG_ANY (4)
   1 <f> <oobar> | 4: Close1 (6)
   1 <f> <oobar> | 6: RIF1 (8)
                                  fallito ...
   1 <f> <oobar> | 1: aperta1 (3)
   1 <f> <oobar> | 3: REG_ANY (4)
   2 <fo> <obar> | 4: Close1 (6)
   2 <fo> <obar> | 6: RIF1 (8)
   3 <foo> <bar> | 8: END (0)
Incontro riuscito!
Liberazione di REx: "(.) \ 1"

Inoltre, puoi aggiungere spazi bianchi e commenti alle regex per renderli più leggibili. In Perl, questo viene fatto con il /xmodificatore. Con pcre, c'è la PCRE_EXTENDEDbandiera.

"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: Perché qualcuno preferirebbe Regexbuddy a questo?
Charles Stewart,

1
Mi piace questo metodo, anche se penso che il regex buddy sia migliore.
Torre

echo "foobar" | egrep "(.) \ 1"
DmitrySandalov il

30

Ne aggiungerò un altro per non dimenticarlo: debuggex

È buono perché è molto visivo: Foto dell'assistente regex di Debuggex


debuggex in realtà non funziona per me: i caratteri sono applicati da JavaScript, a quanto pare, e non funzionano (ho caratteri monospaziati, la console di Firefox li usa perfettamente). Di conseguenza il display è inutilizzabile. Inoltre, il test JavaScript blocca il browser con molti casi di test, per ogni edizione (non solo una volta quando viene attivato). Infine, alcune delle regex proposte sono infastidite e non corrispondono come previsto.
7heo.tk,

28

Quando rimango bloccato su un regex di solito mi rivolgo a questo: https://regexr.com/

È perfetto per testare rapidamente dove qualcosa non va.


1
Questo strumento è davvero utile: è ospitato sul web, quindi non è possibile installarlo, è in tempo reale, quindi il debug è un sogno e ha anche utili suggerimenti e un elenco di caratteri speciali, nel caso in cui non ricordi qualcosa. È perfetto, grazie mille
Jason Ridge il

Sfortunatamente, questo strumento (ancora) non ti permette di cambiare i delimitatori regex (anche per il motore PCRE) - sono riparati come /(barre). Questo è uno spettacolo per me.
MrWhite il

19

Uso Kodos - The Python Regular Expression Debugger:

Kodos è un'utilità della GUI di Python per la creazione, il test e il debug di espressioni regolari per il linguaggio di programmazione Python. Kodos dovrebbe aiutare qualsiasi sviluppatore a sviluppare in modo efficiente e senza sforzo espressioni regolari in Python. Poiché l'implementazione di espressioni regolari da parte di Python si basa sullo standard PCRE , Kodos dovrebbe favorire gli sviluppatori in altri linguaggi di programmazione che aderiscono allo standard PCRE (Perl, PHP, ecc ...).

(...)

testo alternativo

Funziona su Linux, Unix, Windows, Mac.


2
Kodos non fornisce funzionalità di debug reali. Non è possibile aumentare la regex né mettere in pausa l'esecuzione.
candide,

Qualche consiglio su come farlo funzionare su un Mac? Il sito di Sourceforge non offre alcuna informazione sull'installazione per Mac e il mio Google-fu sembra non riuscire.
Adam Parkin,

Anche se questo sembra essere Python2, e non è stato aggiornato dal 2006 (14 anni fa al momento della stesura)?
MrWhite,

13

Penso che non lo facciano. Se regexp è troppo complicato e problematico al punto che è necessario un debugger, è necessario creare un parser specifico o utilizzare un altro metodo. Sarà molto più leggibile e mantenibile.


4
Amico, l'hai postato dopo aver visto la schermata regexbuddy?
arrosto il

2
Tutti non saranno d'accordo con questo, ma non è una cattiva idea. Tutti presumono che il motore regex sia più efficiente con regex enormi. Questo non è necessariamente vero, e sicuramente non sono facili da leggere. Spezza le tue regex.
Dan Rosenstark,

1
@Michael Brooks: No, prima, in realtà. Dopo aver visto lo screenshot, sto bene con il fatto che PUOI eseguire il debug di una regexp. Ma sono fedele alla mia idea: quando una regexp diventa troppo complicata, è tempo di cambiare in un altro modo.
Valentin Rocher,

12

Esiste un eccellente strumento gratuito, il Regex Coach . L'ultima versione è disponibile solo per Windows; il suo autore Dr. Edmund Weitz ha smesso di mantenere la versione Linux perché troppe persone l'hanno scaricata, ma c'è una versione precedente per Linux nella pagina di download.


8

Ho appena visto una presentazione di Regexp :: Debugger del suo creatore: Damian Conway. Roba molto impressionante: esegui sul posto o usando uno strumento da riga di comando (rxrx), in modo interattivo o su un file di esecuzione "registrato" (memorizzato in JSON), fai un passo avanti e indietro in qualsiasi punto, fermati su punti di interruzione o eventi, output colorato (configurabile dall'utente ), mappe di calore su regexp e stringa per ottimizzazione, ecc ...

Disponibile su CPAN gratuitamente: http://search.cpan.org/~dconway/Regexp-Debugger/lib/Regexp/Debugger.pm


OP ha detto "Non posso fare un passo avanti con un'espressione regolare con un debugger."
quantum

Hai un link alla presentazione?
torre

3
@Rook, puoi visualizzare la presentazione su youtube.com/watch?v=zcSFIUiMgAs
Starfish


6

Debug dei miei regex con i miei occhi. Ecco perché uso il /xmodificatore, scrivo commenti per loro e li divido in parti. Leggi Mastering Regular Expressions di Jeffrey Friedl per imparare a sviluppare espressioni regolari veloci e leggibili. Vari strumenti di debug regex provocano solo la programmazione voodoo.


5

Per quanto mi riguarda di solito uso l'utilità pcretest che può scaricare il codice byte di qualsiasi regex, e di solito è molto più facile da leggere (almeno per me). Esempio:

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


3

Se mi sento bloccato, mi piace tornare indietro e generare la regex direttamente da un testo di esempio usando txt2re (anche se di solito finisco per modificare manualmente la regex risultante).




2

Scrivere reg ex usando una notazione come PCRE è come scrivere assemblatore: va bene se riesci a vedere solo gli automi a stati finiti corrispondenti nella tua testa, ma può essere difficile da mantenere molto rapidamente.

Le ragioni per non usare un debugger sono molto simili a quelle per non usare un debugger con un linguaggio di programmazione: puoi correggere gli errori locali, ma non ti aiuteranno a risolvere i problemi di progettazione che ti hanno portato a fare gli errori locali nel primo posto.

Il modo più riflessivo è utilizzare le rappresentazioni dei dati per generare regexps nel tuo linguaggio di programmazione e avere astrazioni appropriate per costruirle. L'introduzione di Olin Shiver alla notazione regexp del suo schema offre un'eccellente panoramica delle problematiche affrontate nella progettazione di queste rappresentazioni dei dati.


I combinatori parser sono davvero un ottimo modo di procedere: Parsec e PArrows in Haskell, rsec in Ruby, Boost Spirit in C ++, PyParsing in Python, Perl6 :: Regole in Perl, ecc.
Ephemient,

2

Uso spesso pcretest - quasi un "debugger" ma funziona su una connessione SSH di solo testo e analizza esattamente il dialetto regex di cui ho bisogno: il mio codice (C ++) si collega a libpcre, quindi non ci sono difficoltà con sottili differenze in ciò che è magico e cosa non lo è, ecc.

In generale, sono d'accordo con il ragazzo sopra a chi ha bisogno di un debugger regex è un odore di codice. Per me il più difficile usare regex non è di solito la regex stessa, ma i molteplici livelli di quotazione necessari per farli funzionare.





0

Per me, dopo aver osservato il regex (dato che sono abbastanza fluente e quasi sempre uso / x o equivalente), potrei eseguire il debug piuttosto che testare se non sono sicuro di colpire un abbinamento degenerato (cioè qualcosa che fa eccessivamente arretramento) per vedere se potevo risolvere tali problemi modificando, ad esempio, l'avidità di un operatore.

Per fare ciò, utilizzerei uno dei metodi sopra menzionati: pcretest, RegexBuddy (se il mio attuale posto di lavoro lo ha concesso in licenza) o simile, e talvolta lo cronometro in Linqpad se lavoro in regex C #.

(Il trucco perl è nuovo per me, quindi probabilmente lo aggiungerò anche al mio toolkit regex.)

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.