2011-06-08 8 views
5

¿Cómo es que este código es verdadero?Confusión de tubo de expresión regular

cadena al partido: ab

patrón: /^a|b$/

pero cuando pongo paréntesis, así:

patrón: /^(a|b)$/

que luego regresará false.

+0

PHP, C++, Python, ¿qué implementación de expresiones regulares estás preguntando? (Parece PHP PCRE para mí) – BoltClock

+1

Creo que tienen la misma implementación con respecto al código que he proporcionado, así que los puse en las etiquetas:/ – Rei

Respuesta

12

El primer patrón sin el paréntesis es equivalente a /(^a)|(b$)/.
La razón es, que el operador de la tubería ("operador de la alternancia") tiene la prioridad más baja de todos los operadores de expresiones regulares: http://www.regular-expressions.info/alternation.html (Tercer párrafo debajo de la primera denominación)

+0

¡guau, sus respuestas son rápidas! ¡Muchas gracias! – Rei

+0

¡Esta respuesta necesita actualización ya que el enlace está roto! –

+0

@JoshDavenport: Gracias, hecho –

4

El primer medio comienza por a o termina en b.

El segundo significa 1 carácter, a o b.

7

/^a|b$/ coincide con una cadena que comienza con un a O termina con a b. Por lo tanto, coincide con afoo, barb, a, b.

/^(a|b)$/: Coincide con una cadena que comienza y finaliza con a o b. Por lo tanto, coincide con a o b y nada más.

Esto ocurre porque la alteración | tiene muy poca precedencia entre los operadores de expresiones regulares.

Related discussion

+1

+1 explicación clara && examples && reason _why_, no solo _what_ – Wiseguy

1

| tiene menor prioridad que los anclajes, por lo que está diciendo, ya sea ^a o b$ (lo cual es cierto) en comparación con el segundo uno, que significa "una sola cadena de caracteres, ya sea a o b" (que es falso).

+0

tiene una prioridad ** más baja **, ¡no una más alta! –

+0

Er, claro, quise decir que se evaluó * antes * :) Siempre he encontrado que esta cosa menor/superior es arbitraria y contra-intuitiva ... – Blindy

+1

Pero no se ha evaluado _antes de - se ha evaluado _después_.La prioridad más baja se evalúa al final, la más alta es la primera. Eso debería ser intuitivo. Creo que es la terminología "antes/después" la que está causando la confusión, ya que la más externa/más grande realmente sugiere una prioridad más baja. – Wiseguy

1

En ^a|b$ se está buscando por una a al principio o b al final.

En ^(a|b)$ se está buscando un a o un b siendo el único personaje (al principio y al final).