Regex plus vs differenza di stelle?


90

Qual è la differenza tra:

(.+?)

e

(.*?)

quando lo uso nella mia preg_matchregex php ?

Risposte:


150

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


2
"pigro" è il termine più comune per "ungreedy"
Walter Tross

L'esempio non è corretto. Sia (.+?)e (.*?)si comportano in modo diverso in una diversa posizione di espressioni regolari che sono a(.+?), (.+?)b, a(.+?)b, a(.*?), (.*?)b, a(.*?)b.
Louis55

Perché a. * B non restituirebbe "ab"? Non sta dicendo "parola che ha tra aeb, 0 o più caratteri", quindi, ab ha zero caratteri tra e potrebbe essere una corrispondenza. Perché non è corretto?
Hello World,

@ HelloWorld, questo ha a che fare con l'avidità che ho spiegato sopra. .*corrisponderà il più possibile. Se vuoi fermarti il ​​prima possibile, devi renderlo ungreedy.*?
stema

22

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


1
Dipende se il modificatore s è impostato o meno.
Quentin

8

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.


8

+ 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.


8

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

Penso che questa sia la risposta migliore in particolare alla domanda + vs *
Terrence

6

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


"+ is minimal one"Cosa significa questa frase?
Det

5

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


4

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ù.


2

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.