¿Alguien me puede explicar cuál es la diferencia entre [0-9]+
y [0-9]++
?¿Cuál es la diferencia entre [0-9] + y [0-9] ++?
Respuesta
El motor PCRE, que PHP utiliza para las expresiones regulares, apoya "possessive quantifiers":
Cuantificadores seguido de
+
son "posesivo". Comen la mayor cantidad de personajes posible y no vuelven a coincidir con el resto del patrón. Por lo tanto,.*abc
coincide con"aabc"
pero.*+abc
no porque.*+
se come toda la cadena. Los cuantificadores posesivos se pueden usar para acelerar el procesamiento.
Y:
Si la opción PCRE_UNGREEDY se establece (una opción que no está disponible en Perl) a continuación, los cuantificadores no son codiciosos por defecto, pero las individuales se pueden hacer codiciosos en pos de ellas con un signo de interrogación. En otras palabras, invierte el comportamiento predeterminado.
la diferencia es por lo tanto:
/[0-9]+/ - one or more digits; greediness defined by the PCRE_UNGREEDY option
/[0-9]+?/ - one or more digits, but as few as possible (non-greedy)
/[0-9]++/ - one or more digits, but as many as possible (greedy, default)
This snippet visualiza la diferencia en el modo de codiciosos por defecto. Tenga en cuenta que el primer fragmento es funcionalmente el mismo que el anterior, porque el +
adicional ya está (en cierto sentido) ya aplicado por defecto.
This snippet visualiza la diferencia al aplicar PCRE_UNGREEDY (modo desagregado por defecto). Vea cómo se invierte el valor predeterminado.
++
(y ?+
, *+
y {n,m}+
) son llamados possessive quantifiers.
[0-9]+
y [0-9]++
coinciden con uno o más dígitos ASCII, pero el segundo no permitirá que el motor de expresiones regulares retroceda en la coincidencia si eso fuera necesario para que la expresión regular general tenga éxito.
Ejemplo:
[0-9]+0
concuerda con la cadena 00
, mientras que [0-9]++0
no.
En el primer caso, [0-9]+
primeros partidos 00
, pero luego se echa para atrás un carácter para permitir la siguiente 0
para que coincida. En el segundo caso, el ++
lo impide, por lo tanto, falla la coincidencia completa.
No todos los sabores regex admiten esta sintaxis; algunos otros implementan atomic groups en su lugar (o incluso ambos).
¡Gracias por tu respuesta! – user557108
- 1. ¿Es posible usar WPF y Delphi 2007/09 win32?
- 2. Crontab establece 18:00 a 09:00
- 3. ¿Cuál es la diferencia entre LinkedBlockingQueue y ConcurrentLinkedQueue?
- 4. ¿Cuál es la diferencia entre {0} y ""?
- 5. Cuál es la diferencia entre = y: =
- 6. ¿Cuál es la diferencia entre .ToString (+) y ""
- 7. Cuál es la diferencia entre $ (...) y `...`
- 8. ¿cuál es la diferencia entre:.! y: r !?
- 9. ¿Cuál es la diferencia entre ".equals" y "=="?
- 10. ¿Cuál es la diferencia entre dict() y {}?
- 11. ¿Cuál es la diferencia entre `##` y `hashCode`?
- 12. ¿Cuál es la diferencia entre "$^N" y "$ +"?
- 13. ¿Cuál es la diferencia entre [indefinido] y [,]?
- 14. ¿Cuál es la diferencia entre + = y = +?
- 15. ¿Cuál es la diferencia entre " " y ""?
- 16. Cuál es la diferencia entre $ y jQuery
- 17. convertir 01, 02, 03, 04 .. 09 a 1,2,3,4 ... 9
- 18. ¿Cuál es el patrón de expresiones regulares para fecha y hora (2008-09-01 12:35:45)?
- 19. La cadena '3/18/09 10:16 PM' no es un valor válido de AllXsd
- 20. OpenGL (ES) - ¿Cuál es la diferencia entre frustum y orto?
- 21. ¿Cuál es la diferencia entre "nuevo número (...)" y "número (...)" en JavaScript?
- 22. Cuál es la diferencia entre la función() {}() y la función() {}()
- 23. ¿Cuál es la diferencia entre la abstracción y la encapsulación?
- 24. ¿Cuál es la diferencia entre @ y $ y% en MSBuild?
- 25. ¿Cuál es la diferencia entre la vinculación estática y dinámica?
- 26. ¿Cuál es la diferencia entre la sección .got y .got.plt?
- 27. ¿Cuál es la diferencia entre el colado y la coerción?
- 28. ¿cuál es la diferencia entre el complemento y la biblioteca?
- 29. ¿Cuál es la diferencia entre el casting y la conversión?
- 30. ¿Cuál es la diferencia entre WPF y la aplicación Silverlight?
Esto no es todo un duplicado, pero debería responder a la pregunta: http://stackoverflow.com/questions/4489551/what-is-double-plus-in-regular-expressions – Spudley
Nunca he oído hablar de ' ++ 'en expresiones regulares, y parece que muchos otros tampoco, pero un poco de excavación muestra que es válido. – Spudley
Lo siento, no encontré eso. – user557108