El modo multilínea está habilitado por el indicador m
.
Solo afecta el comportamiento de ^
y $
.
En el modo multilínea, coinciden no solo al principio y al final de la cadena, sino también al inicio/final de la línea.
Buscando al inicio de línea ^
En el siguiente ejemplo, el texto tiene varias líneas. El patrón /^\d/gm
toma un dígito desde el principio de cada línea:
let str = `1er lugar: Winnie
2do lugar: Piglet
3er lugar: Eeyore`;
console.log( str.match(/^\d/gm) ); // 1, 2, 3
Sin la bandera m
solo coincide el primer dígito:
let str = `1er lugar: Winnie
2do lugar: Piglet
3er lugar: Eeyore`;
console.log( str.match(/^\d/g) ); // 1
Esto se debe a que, de forma predeterminada, un caret ^
solo coincide al inicio del texto y en el modo multilínea, al inicio de cualquier línea.
“Inicio de una línea” significa formalmente “inmediatamente después de un salto de línea”: la prueba ^
en modo multilínea coincide en todas las posiciones precedidas por un carácter de línea nueva \n
.
Y al comienzo del texto.
Buscando al final de la línea $
El signo de dólar $
se comporta de manera similar.
La expresión regular \d$
encuentra el último dígito en cada línea
let str = `Winnie: 1
Piglet: 2
Eeyore: 3`;
console.log( str.match(/\d$/gm) ); // 1,2,3
Sin la bandera m
, dólar $
solo coincidiría con el final del texto completo, por lo que solo se encontraría el último dígito.
“Fin de una línea” significa formalmente “inmediatamente antes de un salto de línea”: la prueba $
en el modo multilínea coincide en todas las posiciones seguidas por un carácter de línea nueva \n
.
Y al final del texto.
Buscando \n en lugar de ^ $
Para encontrar una línea nueva, podemos usar no solo las anclas ^
y $
, sino también el carácter de línea nueva \n
.
¿Cual es la diferencia? Veamos un ejemplo.
Buscamos \d\n
en lugar de \d$
:
let str = `Winnie: 1
Piglet: 2
Eeyore: 3`;
console.log( str.match(/\d\n/g) ); // 1\n,2\n
Como podemos ver, hay 2 coincidencias en lugar de 3.
Esto se debe a que no hay una línea nueva después de 3
(sin embargo, hay un final de texto, por lo que coincide con $
).
Otra diferencia: ahora cada coincidencia incluye un carácter de línea nueva \n
. A diferencia de las anclas ^
$
, que solo prueban la condición (inicio/final de una línea), \n
es un carácter, por lo que se hace parte del resultado.
Entonces, un \n
en el patrón se usa cuando necesitamos encontrar caracteres de línea nueva, mientras que las anclas se usan para encontrar algo “al principio/al final” de una línea.