¿Cuál es el significado de + en una expresión regular?

¿Qué significa el símbolo más en regex?

+ puede tener dos significados, dependiendo del contexto.

Al igual que las otras respuestas mencionadas, + general es un operador de repetición , y hace que el token anterior se repita una o más veces. a+ se expressía como aa* en la teoría del lenguaje formal , y también podría expressse como a{1,} (coincidir un mínimo de 1 vez y un máximo de infinitos tiempos).


Sin embargo, + también puede hacer que otros cuantificadores sean posesivos si sigue a un operador de repetición (es decir ?+ , *+ , ++ o { m , n }+ ). Un cuantificador posesivo es una característica avanzada de algunos sabores de expresiones regulares (PCRE, Java y el motor JGsoft) que le dice al motor que no retroceda una vez que se ha realizado una coincidencia.

Para comprender cómo funciona esto, debemos entender dos conceptos de los motores de expresiones regulares: codicia y retroceso . La codicia significa que, en general, las expresiones regulares intentarán consumir tantos personajes como sea posible. Digamos que nuestro patrón es .* (El punto es una construcción especial en expresiones regulares que significa cualquier carácter 1 ; la estrella significa que coincide con cero o más veces), y tu objective es aaaaaaaab . Se consumirá toda la cadena, porque toda la cadena es la coincidencia más larga que satisface el patrón.

Sin embargo, digamos que cambiamos el patrón a .*b Ahora, cuando el motor regex intente hacer coincidir contra aaaaaaaab , el .* Volverá a consumir toda la cadena. Sin embargo, dado que el motor habrá alcanzado el final de la cadena y el patrón aún no se ha satisfecho (el .* Consumió todo, pero el patrón aún tiene que coincidir con b después), retrocederá , un carácter a la vez, y tratará de partido b . El primer retroceso hará que el .* Consum aaaaaaaa , y luego b puede consumir b , y el patrón tiene éxito.

Los cuantificadores posesivos también son codiciosos, pero como se mencionó, una vez que devuelven un fósforo, el motor ya no puede retroceder más allá de ese punto. Entonces, si cambiamos nuestro patrón a .*+b (unir cualquier personaje a cero o más veces, posesivamente, seguido de a b ), e intentamos hacer coincidir aaaaaaaab , nuevamente el .* Consumirá toda la cuerda, pero como es posesiva , la información de retroceso se descarta y la b no puede coincidir, por lo que el patrón falla.


1 En la mayoría de los motores, el punto no coincidirá con un carácter de línea nueva, a menos que se especifique el modificador /s (“línea única” o “puntoal”).

En la mayoría de las implementaciones + significa “uno o más”.

En algunas escrituras teóricas + se usa para significar “o” (la mayoría de las implementaciones usan el símbolo | para eso).

1 o más de la expresión anterior.

[0-9]+

Coincidencia:

1234567890

En:

Tengo 1234567890 dólares

Una o más ocurrencias de los símbolos anteriores.

Por ejemplo, a+ significa la letra a o más veces. Por lo tanto, a coincide con a , aa , aaaaaa , pero no con una cadena vacía.

Si sabe lo que significa el asterisco ( * ), puede express (exp)+ como (exp)(exp)* , donde (exp) es cualquier expresión regular.