2015-12-28 12 views
7

Nel tentativo di elaborare una risposta alla domanda this, ora sto cercando di venire a patti con il comportamento/significato delle espressioni regolari Zero-Length.regex a lunghezza zero e corrispondenze infinite?

Spesso uso www.regexr.com come un parco giochi per testare/eseguire il debug/capire cosa succede nelle espressioni regolari.

Quindi abbiamo questo scenario più banale:

L'espressione regolare è a*

La stringa di input è dgwawa (È un dato di fatto, la stringa qui è irrilevante)

Perché questo comportamento di segnalare che questa regex corrisponderà all'infinito, poiché corrisponde a zero occorrenze del carattere precedente?

Perché il risultato non può essere di 6 corrispondenze, una per ogni posizione di carattere (poiché ad ogni carattere, indipendentemente dal fatto che si tratti di un a oppure no, c'è una corrispondenza, poiché le corrispondenze zero sono una corrispondenza)?

Come si combina all'infinito? Quindi non è check/progress un personaggio alla volta?

Mi chiedo come/dove si immette in un ciclo infinito.

enter image description here

risposta

11

Il tester regex linea regexr.com è stato progettato per il test regex Javascript. Il motore regex JavaScript non sposta automaticamente l'indice quando viene passato un pattern che può corrispondere a una stringa vuota.

È per questo che quando si ha bisogno di emulare il comportamento osservato in .NET Regex.Matches, PHP preg_match_all, Python re.finditer, ecc è necessario far avanzare manualmente l'indice di testare ogni posizione.

Vedi regex101.com test:

var re = /a*/g; 
 
var str = 'dgwawa'; 
 
var m; 
 
    
 
while ((m = re.exec(str)) !== null) { 
 
    if (m.index === re.lastIndex) { // <- this part 
 
     re.lastIndex++;    // <- here 
 
    }         // <- is important 
 
    document.body.innerHTML += "'" + m[0] + "'<br/>"; 
 
}

Se si rimuove che if blocco, si otterrà un ciclo infinito.

Ci sono due cose molto importanti da citare a questo proposito:

  • Sempre un uso appropriato tester regex online per il linguaggio di programmazione
  • Evitare l'uso di modelli unanchored che possono abbinare stringhe vuote
+0

Bello. Mi è stato detto prima che regexr segua uno specifico sapore regex. Dovrei tenerne conto più seriamente. – Veverke

+1

Vedere [* Sandbox online (per testare e pubblicare regex online) *] (http://stackoverflow.com/tags/regex/info) per selezionare quello desiderato. –

+0

Grazie per la risposta completa e approfondimenti! Lavoro eccellente. – Veverke

1

Ci sono in realtà 7 partite

Mi permetta loro di elencare, primo numero è l'inizio (0 sulla base), secondo numero è la lunghezza

Match 1:    0  0 
Match 2:    1  0 
Match 3:    2  0 
Match 4: a  3  1 
Match 5:    4  0 
Match 6: a  5  1 
Match 7:    6  0 

Io uso regex101 e fa quello che molti di noi si aspettano da questa semplice regex (dato che ci sono dialetti regex).

https://regex101.com/r/mN4jA4/1

+0

Sarei felice se il sito riportasse 7, il mio problema è che si tratta di corrispondenze "infinite"?! Penserei come te, ma temo che il meccanismo non funzioni in questo modo. – Veverke

Problemi correlati