Qual è la differenza tra:
(.+?)
e
(.*?)
quando lo uso nella mia preg_matchregex php ?
Qual è la differenza tra:
(.+?)
e
(.*?)
quando lo uso nella mia preg_matchregex php ?
Risposte:
Sono chiamati quantificatori.
* 0 o più dell'espressione precedente
+ 1 o più dell'espressione precedente
Per impostazione predefinita, un quantificatore è avido, il che significa che corrisponde al maggior numero di caratteri possibile.
Il ?dopo che un quantificatore cambia il comportamento per renderlo "ungreedy", significa che corrisponderà il meno possibile.
Esempio avido / non greedy
Ad esempio sulla stringa " abab "
a.*b corrisponderà a "abab" (preg_match_all restituirà una corrispondenza, "abab")
mentre a.*?bcorrisponderà solo alla "ab" iniziale (preg_match_all restituirà due corrispondenze, "ab")
Puoi testare le tue regex online, ad esempio su Regexr, guarda l'esempio avido qui
(.+?)e (.*?)si comportano in modo diverso in una diversa posizione di espressioni regolari che sono a(.+?), (.+?)b, a(.+?)b, a(.*?), (.*?)b, a(.*?)b.
.*corrisponderà il più possibile. Se vuoi fermarti il prima possibile, devi renderlo ungreedy.*?
A +corrisponde a una o più istanze del modello precedente. A *corrisponde a zero o più istanze del modello precedente.
Quindi, fondamentalmente, se usi un +ci deve essere almeno un'istanza del pattern, se lo usi *continuerà a corrispondere se non ci sono istanze di esso.
+ corrisponde ad almeno un carattere
* corrisponde a qualsiasi numero (compreso 0) di caratteri
Il ?indica un'espressione pigra, quindi corrisponderà al minor numero di caratteri possibile.
Considera di seguito la stringa da abbinare.
ab
Il modello (ab.*) restituirà una corrispondenza per il gruppo di acquisizione con il risultato diab
Mentre il modello (ab.+)non corrisponderà e non restituirà nulla.
Ma se cambi la stringa in following, tornerà abaper pattern(ab.+)
aba
In RegEx, {i,f}significa "tra idi fpartite". Diamo un'occhiata ai seguenti esempi:
{3,7} significa da 3 a 7 corrispondenze {,10} significa fino a 10 corrispondenze senza limite inferiore (ovvero il limite inferiore è 0){3,} significa almeno 3 corrispondenze senza limite superiore (ovvero il limite superiore è infinito){,} significa nessun limite superiore o limite inferiore per il numero di corrispondenze (cioè il limite inferiore è 0 e il limite superiore è infinito){5} significa esattamente 4 La maggior parte delle buone lingue contiene abbreviazioni, così come le espressioni regolari:
+ è l'abbreviazione di {1,}* è l'abbreviazione di {,}? è l'abbreviazione di {,1}Ciò significa che +richiede almeno 1 corrispondenza mentre *accetta un numero qualsiasi di corrispondenze o nessuna corrispondenza e ?accetta non più di 1 corrispondenza o zero corrispondenze.
Credito: Codecademy.com
Una stella è molto simile a un più, l'unica differenza è che mentre il più corrisponde a 1 o più del carattere / gruppo precedente, la stella corrisponde a 0 o più.
Penso che le risposte precedenti non riescano a evidenziare un semplice esempio:
per esempio abbiamo un array:
numbers = [5, 15]
La seguente espressione regolare ^[0-9]+corrisponde a: 15solo. Tuttavia, ^[0-9]*corrisponde a entrambi 5 and 15. La differenza è che l' +operatore richiede almeno un duplicato della precedente espressione regex