¿Regex plus vs diferencia de estrellas?


90

Cuál es la diferencia entre:

(.+?)

y

(.*?)

cuando lo uso en mi php preg_matchregex?

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í


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 ( .).


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.


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.


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

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.


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


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.


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

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.