2011-05-31 25 views
7

¿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] ++?

+2

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

+0

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

+0

Lo siento, no encontré eso. – user557108

Respuesta

14

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.

+0

¿Por qué está esto downvoted? La pregunta originalmente tenía una etiqueta 'php'. – thirtydot

+0

@thirtydot: Y todavía lo hace. –

+2

Solo porque lo agregué de vuelta :) – thirtydot

4

++ (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).

+0

¡Gracias por tu respuesta! – user557108

Cuestiones relacionadas