2013-01-08 50 views
6

Qualcuno può spiegare la differenza tra .+ e .+?Differenza tra ". +" E ". +?"

ho la stringa: "extend cup end table"

  1. Il modello e.+d reperti: extend cup end
  2. Il modello e.+?d reperti: extend e end

So che + è uno o più e ? è uno o zero. Ma non sono in grado di capire come funziona.

+0

Come indicato di seguito, è la differenza tra quantificatori avidi e pigri. Avido vuole consumare il più possibile, pigro il meno possibile. Il motore "costruisce la stringa" carattere per carattere, da sinistra a destra, quando il quantificatore è pigro. Greedy farà il contrario.Consumerà il più possibile e quindi lascerà cadere alcuni caratteri, da destra a sinistra, se necessario. Guarda i seguenti esempi: http://regex101.com/r/dG9zZ2 e http://regex101.com/r/tP5xQ3 –

risposta

16

Entrambi corrisponderanno a qualsiasi sequenza di uno o più caratteri. La differenza è che:

  • .+ è avidi e consuma il maggior numero di personaggi come può.
  • .+? è riluttante e consuma il minor numero possibile di caratteri.

Vedere Differences Among Greedy, Reluctant, and Possessive Quantifiers nel tutorial Java.

Così:

  • e.+d trova la stringa più lunga che inizia con e e termina con d (e contiene almeno un carattere tra).
  • e.+?d trovare la sottostringa di questo tipo. Nel tuo esempio, extend e end sono due corrispondenze non sovrapposte, quindi trova entrambe.
+0

Ho appena testato le espressioni su rubular.com, e in realtà sono un po 'sconcertato perché aggiungere? rende l'espressione ignorare "tazza". La tua risposta in realtà non lo spiega in dettaglio. Sarebbe possibile aggiungerne una o due? – Henrik

+0

@Henrik Il risultato era simile nella domanda, c'era una strana formattazione nella domanda originale che non ero riuscito a modificare correttamente al primo tentativo – Kapep

5

L'espressione regolare e.+?d corrisponde a un 'e' e poi cerca di far corrispondere il minor numero di caratteri possibile (ungreedy o riluttanti), seguito da un 'd'. È per questo che i seguenti 2 sottostringhe sono abbinati:

extend cup end table 
^^^^^^  ^^^ 
    1   2 

L'espressione regolare e.+d corrisponde a un 'e' e poi cerca di far corrispondere il più personaggi possibile (avidi), seguito da un 'd'. Quello che succede è che il primo 'e' è trovato, e poi i .+ partite tanto quanto può (fino alla fine della linea, o ingresso):

extend cup end table 
^^^^^^^^^^^^^^^^^^^^ 

Il motore regex arriva alla fine della riga (o input) e non possono corrispondere allo 'd' nel modello regex. Quindi torna indietro fino all'ultimo 'd' è visto. Questo è il motivo per cui viene trovata la corrispondenza singola:

extend cup end table 
^^^^^^^^^^^^^^<----- backtrack 
    1