Cuál es la diferencia entre:
(.+?)
y
(.*?)
cuando lo uso en mi php preg_match
regex?
Cuál es la diferencia entre:
(.+?)
y
(.*?)
cuando lo uso en mi php preg_match
regex?
Respuestas:
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.*?b
coincidirá 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í
(.+?)
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
.
.*
coincidirá tanto como sea posible. Si desea detenerse lo antes posible, entonces debe hacerlo sin codicia.*?
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.
+
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.
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á aba
para el patrón(ab.+)
aba
En expresiones regulares, {i,f}
significa "entre i
a f
partidos". 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
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.
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: 15
solo. 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