21 de junio de 2020

Anclas: inicio ^ y final $ de cadena

Los patrones caret (del latín carece) ^ y dólar $ tienen un significado especial en una expresión regular. Se llaman “anclas”.

El patrón caret ^ coincide con el principio del texto y dólar $ con el final.

Por ejemplo, probemos si el texto comienza con Mary:

let str1 = "Mary tenía un corderito";
alert( /^Mary/.test(str1) ); // true

El patrón ^Mary significa: “inicio de cadena y luego Mary”.

Similar a esto, podemos probar si la cadena termina con nieve usando nieve$:

let str1 = "su vellón era blanco como la nieve";
alert( /nieve$/.test(str1) ); // true

En estos casos particulares, en su lugar podríamos usar métodos de cadena beginWith/endsWith. Las expresiones regulares deben usarse para pruebas más complejas.

Prueba para una coincidencia completa

Ambos anclajes ^...$ se usan juntos a menudo para probar si una cadena coincide completamente con el patrón. Por ejemplo, para verificar si la entrada del usuario está en el formato correcto.

Verifiquemos si una cadena esta o no en formato de hora 12:34. Es decir: dos dígitos, luego dos puntos y luego otros dos dígitos.

En el idioma de las expresiones regulares eso es \d\d:\d\d:

let goodInput = "12:34";
let badInput = "12:345";

let regexp = /^\d\d:\d\d$/;
alert( regexp.test(goodInput) ); // true
alert( regexp.test(badInput) ); // false

La coincidencia para \d\d:\d\d debe comenzar exactamente después del inicio de texto^, y seguido inmediatamente, el final $.

Toda la cadena debe estar exactamente en este formato. Si hay alguna desviación o un carácter adicional, el resultado es falso.

Las anclas se comportan de manera diferente si la bandera m está presente. Lo veremos en el próximo artículo.

Las anclas tienen “ancho cero”

Las anclas ^ y $ son pruebas. Ellas tienen ancho cero.

En otras palabras, no coinciden con un carácter, sino que obligan al motor regexp a verificar la condición (inicio/fin de texto).

Tareas

¿Qué cadena coincide con el patrón ^$?

Una cadena vacía es la única coincidencia: comienza y termina inmediatamente.

Esta tarea demuestra una vez más que los anclajes no son caracteres, sino pruebas.

La cadena está vacía "". El motor primero coincide con ^ (inicio de entrada), sí, está allí, y luego inmediatamente el final $, también está. Entonces hay una coincidencia.

Mapa del Tutorial