¿Regex plus vs diferencia de estrellas?

90

Cuál es la diferencia entre:

(.+?)

y

(.*?)

cuando lo uso en mi php preg_matchregex?

David19801
fuente

Respuestas:

150

Se llaman cuantificadores.

* 0 o más de la expresión anterior

+ 1 o más de la expresión anterior

Por defecto, un cuantificador es codicioso, eso significa que coincide con tantos caracteres como sea posible.

El ?después de un cuantificador cambia el comportamiento para hacer de este cuantificador "ungreedy", significa que va a coincidir lo menos posible.

Ejemplo codicioso / desagradable

Por ejemplo en la cadena " abab "

a.*b coincidirá con "abab" (preg_match_all devolverá una coincidencia, el "abab")

while a.*?bcoincidirá solo con el "ab" inicial (preg_match_all devolverá dos coincidencias, "ab")

Puede probar sus expresiones regulares en línea, por ejemplo, en Regexr, vea el ejemplo codicioso aquí

stema
fuente
2
"perezoso" es el término más común para "un codicioso"
Walter Tross
El ejemplo es incorrecto. Tanto (.+?)y (.*?)se comportan de manera diferente en una posición diversos de las expresiones regulares que son a(.+?), (.+?)b, a(.+?)b, a(.*?), (.*?)b, a(.*?)b.
Louis55
¿Por qué a. * B no devolvería "ab"? ¿No dice "palabra que tiene entre ayb, 0 o más caracteres", por lo tanto, ab tiene un carácter cero entre y podría coincidir? ¿Por qué es esto incorrecto?
Hola mundo
@HelloWorld, esto tiene que ver con la codicia que expliqué anteriormente. .*coincidirá tanto como sea posible. Si desea detenerse lo antes posible, entonces debe hacerlo sin codicia.*?
stema
22

El primero ( +) es uno o más caracteres . El segundo ( *) es cero o más caracteres . Ambos son no codiciosos ( ?) y coinciden con cualquier cosa ( .).

Quentin
fuente
1
Eso depende de si el modificador s está configurado o no.
Quentin
8

A +coincide con una o más instancias del patrón anterior. A *coincide con cero o más instancias del patrón anterior.

Entonces, básicamente, si usa un +, debe haber al menos una instancia del patrón, si lo usa *, seguirá coincidiendo si no hay instancias de él.

DaveRandom
fuente
8

+ coincide con al menos un carácter

* coincide con cualquier número (incluido 0) de caracteres

El ?indica una expresión perezosa, por lo que coincidirá con la menor cantidad de caracteres posible.

Xophmeister
fuente
8

Considere a continuación es la cadena para que coincida.

ab

El patrón (ab.*)devolverá una coincidencia para el grupo de captura con el resultado deab

Mientras que el patrón (ab.+) no coincidirá y no devolverá nada.

Pero si cambia la cadena a seguir, volverá abapara el patrón(ab.+)

aba
Azri Jamil
fuente
Creo que esta es la mejor respuesta específicamente a la pregunta de + vs *
Terrence
6

+es mínimo uno, también *puede ser cero.

jeroen
fuente
"+ is minimal one"¿Qué significa esta oración?
Det
5

En expresiones regulares, {i,f}significa "entre ia fpartidos". Echemos un vistazo a los siguientes ejemplos:

  • {3,7} significa entre 3 a 7 partidos
  • {,10} significa hasta 10 coincidencias sin límite inferior (es decir, el límite inferior es 0)
  • {3,} significa al menos 3 coincidencias sin límite superior (es decir, el límite superior es infinito)
  • {,} significa que no hay límite superior o límite inferior para el número de coincidencias (es decir, el límite inferior es 0 y el límite superior es infinito)
  • {5} significa exactamente 4

La mayoría de los buenos idiomas contienen abreviaturas, al igual que RegEx:

  • + es la abreviatura de {1,}
  • * es la abreviatura de {,}
  • ? es la abreviatura de {,1}

Esto significa que +requiere al menos 1 coincidencia mientras *acepta cualquier cantidad de coincidencias o ninguna coincidencia y ?no acepta más de 1 coincidencia o cero coincidencias.

Crédito: Codecademy.com

Miladiouss
fuente
4

Una estrella es muy similar a un más, la única diferencia es que mientras que el más coincide con 1 o más del carácter / grupo anterior, la estrella coincide con 0 o más.

Fantasma de Madara
fuente
2

Creo que las respuestas anteriores no logran resaltar un ejemplo simple:

por ejemplo tenemos una matriz:

numbers = [5, 15]

La siguiente expresión de expresiones regulares ^[0-9]+coincide: 15solo. Sin embargo, ^[0-9]*coincide con ambos 5 and 15. La diferencia es que el +operador requiere al menos un duplicado de la expresión regular anterior

CRT
fuente