2013-01-15 14 views
5

modo i seguenti quantificatori differiscono - rispetto di scenari, velocità, eccQuali sono le differenze tra quantificatori pigri, avidi e possessivi?

  • ?, ?? e ?+ tutti i match 0 o 1 volte.
  • *, *? and * + `tutti corrispondono a 0 o più volte.
  • +, +? e ++ tutte le partite 1 o più volte.

  • ?, * e + sono avidi.
  • ??, *? e +? sono riluttante/pigro.
  • ?+, *+ e ++ sono possessivo.

Qualcuno può aiutarmi a capire cosa significano questi termini? Perché ci sono tre varianti di ogni quantificatore per lo stesso lavoro?

+2

Perché? Perché qualcuno da qualche parte li usa? Hai davvero bisogno di prendere il tempo per leggere i documenti regex e provare le cose usando IRB o rubular.com, vedere come funzionano e ricordare ciò che hai appreso per il futuro. Un sacco di imparare a programmare è sperimentare per osservare gli effetti di piccoli cambiamenti, non chiedere alle persone di spiegare queste cose. –

+0

http://www.regular-expressions.info/possessive.html – Phrogz

+0

@TimPietzcker grazie a te per avermi votato. Non ha importanza per me, ma i voti bassi causano il blocco di "nuovi post" - il che è fatale, penso. Sono meno interessato a tali voti, ma ho troppa confusione con te come persone che hanno un concetto così acuto, per avere tali concetti. Ma alcuni utenti "SO" da un paio di giorni mi stanno vedendo molto più interessati a "votare giù" gli altri, senza conoscere l'importanza delle domande. Va bene se non capisci il mio 'Post'. Ma quando la risposta è stata postata e quando la risposta è troppo conosciuta, allora perché non tornare a votare chi ha votato. – DoLoveSky

risposta

7

prendere la stringa

aaaab 

e vedere come i seguenti regex corrispondono esso:

Regex   Submatches 
       group 1 group 2 group3 
(a?)(a*)(ab) a  aa  ab 
(a??)(a*)(ab)   aaa  ab 
(a?+)(a*)(ab) a  aa  ab 
(a*)(a?)(ab) aaa    ab 
(a*?)(a?)(ab)   aaa  ab 
(a*+)(a?)(ab) aaaa    <Match fails!> 
(a+)(a*)(ab) aaa    ab 
(a+?)(a*)(ab) a  aa  ab 
(a++)(a*)(ab) aaaa    <Match fails!> 

Spiegazione:

  • a? cerca di far corrispondere una a, ma è preparato per abbinare nulla se è necessario per l'intera partita per avere successo
  • a?? prova a non corrispondere a nulla, ma è pronto per corrispondere a uno a se è necessario per l'intera corrispondenza per avere successo.
  • a?+ tenta di far corrispondere uno a. Se è possibile farlo, sarà non indietro per abbinare nulla se fosse necessario per la corrispondenza complessiva per avere successo. Se non può eguagliare un a, allora non accoppierà volentieri nulla, però.
  • a* tenta di far corrispondere il maggior numero possibile di a s, ma è pronto a corrispondere a un numero inferiore di a s, anche a nulla se ciò è necessario per l'intera corrispondenza.
  • prova a non corrispondere a nulla, ma è pronto a corrispondere a altrettante a s come è assolutamente necessario affinché l'intera corrispondenza abbia successo, ma non di più.
  • a*+ tenta di far corrispondere il maggior numero possibile di a s.Se è possibile farlo, sarà non indietro per abbinare meno a s se ciò fosse necessario per la corrispondenza complessiva per avere successo. Se non può eguagliare nemmeno un singolo a, allora non accoppierà volentieri nulla, però.
  • a+ tenta di far corrispondere il maggior numero possibile di a s, ma è pronto a corrispondere a un numero inferiore di a s (ma almeno a uno) se è necessario che l'intera corrispondenza abbia esito positivo.
  • a+? prova ad abbinare solo uno a, ma è pronto a corrispondere a altrettanti a s come assolutamente necessario affinché l'intera corrispondenza abbia successo, ma non di più.
  • a++ tenta di far corrispondere il maggior numero possibile di a s. Se è possibile farlo, sarà non indietro per abbinare meno a s se ciò fosse necessario per la corrispondenza complessiva per avere successo. Se non può eguagliare nemmeno un singolo a, la regex ha esito negativo.
+0

Finalmente una spiegazione esauriente che va oltre il solito "uno o più, ecc.", "Goloso/non avido". Prima! – BernardK

+0

@tim Eccellente! Che spiegazione hai dato semplicemente brillante! Love it Mi è piaciuto! :) '+ 1' per te! – DoLoveSky

+0

@DoLoveSky, non trollare i voti per favore. Vedi http://stackoverflow.com/faq#reputation per una spiegazione su come guadagni la reputazione senza implorarla. –

Problemi correlati