¿Cuál es la diferencia entre:Regex plus vs star difference?
(.+?)
y
(.*?)
cuando lo uso en mi expresión regular php preg_match
?
¿Cuál es la diferencia entre:Regex plus vs star difference?
(.+?)
y
(.*?)
cuando lo uso en mi expresión regular php preg_match
?
Se llaman cuantificadores.
*
0 o más de la expresión anterior
+
1 o más de la expresión anterior
por defecto por un cuantificador es codicioso, eso significa que coincide con tantos caracteres como sea posible.
El ?
después de que un cuantificador cambia el comportamiento para hacer que este cuantificador sea "no codificado", significa que coincidirá lo menos posible.
Ejemplo codicioso/ungreedy
Por ejemplo, en la cadena "ABAB"
a.*b
coincidirá con "ABAB" (preg_match_all volverá una coincidencia, el "ABAB")
mientras que a.*?b
coincidirá solo con el inicio "ab" (preg_match_all devolverá dos coincidencias, "ab")
Puedes probar tus expresiones regulares en línea, p.en Regexr, see the greedy example here
+
es mínimo uno, *
puede ser cero también.
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 (.
).
... excepto las nuevas líneas. –
Eso depende de si el modificador s está establecido o no. – Quentin
A +
coincide con una o más instancias del patrón anterior. Un *
coincide con cero o más instancias del patrón anterior.
Así que, básicamente, si utiliza un +
debe haber al menos una instancia del patrón, si usa *
, seguirá coincidiendo si no hay instancias de este.
+
partidos al menos un carácter
*
coincide con cualquier número (incluyendo 0) de caracteres
El ?
indica una expresión perezosa, por lo que coincidirá con el menor número de caracteres posible.
Una estrella es muy similar a un más, la única diferencia es que mientras el más coincide con 1 o más del carácter/grupo anterior, el inicio coincide con 0 o más.
Considere a continuación la cadena que coincide.
ab
El patrón (ab.*)
volverá a la altura de grupo de captura con el resultado de ab
Mientras que el patrón (ab.+)
no coincidirá y no devolver nada.
Pero si cambia la cadena a continuación, volverá aba
para el patrón (ab.+)
aba
Creo que esta es la mejor respuesta específicamente a la pregunta de + vs * – Terrence
creo que las respuestas anteriores fallan para resaltar un ejemplo sencillo:
por ejemplo tenemos una matriz:
numbers = [5, 15]
la siguiente expresión expresiones regulares ^[0-9]+
partidos o 15
nly. Sin embargo, ^[0-9]*
coincide con 5 and 15
. La diferencia es que el operador +
requiere al menos un duplicado de la expresión regex anterior
En RegEx, {i,f}
medios "entre i
a f
partidos". Vamos a echar un vistazo a los siguientes ejemplos:
{3,7}
significa entre 3 a 7 partidos{,10}
significa hasta 10 partidos sin límite inferior (es decir, el límite inferior es 0){3,}
significa al menos 3 partidos sin límite superior (es decir, el límite superior es el 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 el infinito){5}
medios exactamente 4mayoría de las buenas lenguas contienen abreviaturas, también lo hace RegEx:
+
es la abreviatura de {1,}
*
es la abreviatura de {,}
?
es la abreviatura de {,1}
Esto significa que +
requiere al menos 1 coincidencia, mientras que *
acepta cualquier cantidad de coincidencias o ninguna coincidencia y ?
acepta no más de 1 coincidencia o cero coincidencias.
Crédito: Codecademy.com
Ejemplo correcto http://regexr.com/39t01 – Tomas
"perezoso" es el término más común para "no codicioso" –