Cuál es la diferencia entre:
(.+?)
y
(.*?)
cuando lo uso en mi php preg_match
regex?
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 sona(.+?)
,(.+?)b
,a(.+?)b
,a(.*?)
,(.*?)b
,a(.*?)b
..*
coincidirá tanto como sea posible. Si desea detenerse lo antes posible, entonces debe hacerlo sin codicia.*?
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 (.
).fuente
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.fuente
+
coincide con al menos un carácter*
coincide con cualquier número (incluido 0) de caracteresEl
?
indica una expresión perezosa, por lo que coincidirá con la menor cantidad de caracteres posible.fuente
Considere a continuación es la cadena para que coincida.
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.+)
fuente
+
es mínimo uno, también*
puede ser cero.fuente
"+ is minimal one"
¿Qué significa esta oración?En expresiones regulares,
{i,f}
significa "entrei
af
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 4La 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
fuente
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.
fuente
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 ambos5 and 15
. La diferencia es que el+
operador requiere al menos un duplicado de la expresión regular anteriorfuente