Cuál es la diferencia entre:
(.+?)
y
(.*?)
cuando lo uso en mi php preg_matchregex?
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í
(.+?)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 deabMientras que el patrón
(ab.+)no coincidirá y no devolverá nada.Pero si cambia la cadena a seguir, volverá
abapara 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 "entreiafpartidos". 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:15solo. 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