¿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
.
¿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
.
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)
¡guau, sus respuestas son rápidas! ¡Muchas gracias! – Rei
¡Esta respuesta necesita actualización ya que el enlace está roto! –
@JoshDavenport: Gracias, hecho –
El primer medio comienza por a
o termina en b
.
El segundo significa 1 carácter, a
o b
.
/^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.
+1 explicación clara && examples && reason _why_, no solo _what_ – Wiseguy
|
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).
tiene una prioridad ** más baja **, ¡no una más alta! –
Er, claro, quise decir que se evaluó * antes * :) Siempre he encontrado que esta cosa menor/superior es arbitraria y contra-intuitiva ... – Blindy
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
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).
PHP, C++, Python, ¿qué implementación de expresiones regulares estás preguntando? (Parece PHP PCRE para mí) – BoltClock
Creo que tienen la misma implementación con respecto al código que he proporcionado, así que los puse en las etiquetas:/ – Rei