Regex plus vs differenza di stelle?

Qual è la differenza tra:

(.+?) 

e

 (.*?) 

quando lo uso nel mio php preg_match regex?

Sono chiamati quantificatori.

* 0 o più dell'espressione precedente

+ 1 o più dell'espressione precedente

Per impostazione predefinita un quantificatore è avido, ciò significa che corrisponde a più caratteri possibili.

Il ? dopo che un quantificatore cambia il comportmento per rendere questo quantificatore "ungreedy", significa che corrisponderà il less ansible.

Esempio avido / non gettato

Ad esempio sulla string " abab "

a.*b corrisponderà "abab" (preg_match_all restituirà una corrispondenza, il "abab")

mentre a.*?b corrisponderà solo all'avvio "ab" (preg_match_all restituirà due corrispondenze, "ab")

Puoi testare le tue regex online ad es. Su Regexr, vedi l'esempio goloso qui

Il primo ( + ) è uno o più caratteri . Il secondo ( * ) è zero o più caratteri . Entrambi sono non-golosi ( ? ) E corrispondono a qualsiasi cosa ( . ).

+ è uno minimo, * può anche essere zero.

A + corrisponde a una o più istanze del model precedente. A * corrisponde a zero o più istanze del model precedente.

Quindi, in sostanza, se usi un + deve esserci alless un'istanza del model, se usi * esso continuerà a corrispondere se non ci sono istanze di esso.

+ corrisponde alless a un personaggio

* corrisponde a qualsiasi numero (incluso 0) di caratteri

Il ? indica un'espressione pigra, quindi corrisponderà al minor numero di caratteri ansible.

Una stella è molto simile a un plus, l'unica differenza è che mentre il segno più corrisponde a 1 o più del carattere / gruppo precedente, l'inizio corrisponde a 0 o più.

Considerare di seguito è la string da abbinare.

 ab 

Il model (ab.*) Restituirà una corrispondenza per il gruppo di cattura con il risultato di ab

Mentre il model (ab.+) Non corrisponde e non restituisce nulla.

Ma se cambi la string in following, ritornerà aba for pattern (ab.+)

 aba 

Penso che le risposte precedenti non riescano a mettere in evidenza un semplice esempio:

per esempio abbiamo un arrays:

 numbers = [5, 15] 

La seguente espressione regolare ^[0-9]+ corrisponde: solo 15 . Tuttavia, ^[0-9]* corrisponde sia a 5 and 15 . La differenza è che l'operatore + richiede alless un duplicato dell'espressione regex precedente