Flag m (multilínea) en las expresiones regulares de JavaScript
El flag m en las expresiones regulares de JavaScript permite que los anclajes ^ y $ coincidan con el inicio y el final de cada línea de un string multilínea.
Introducción al modo multilínea
El flag m de las expresiones regulares de JavaScript permite que los anclajes ^ y $ coincidan con el inicio y el final de cada línea dentro de un string multilínea, en lugar de coincidir solo con el inicio y el final del string completo. Resulta especialmente útil cuando trabajas con texto de varias líneas y necesitas buscar patrones línea por línea.
Esta página explica qué cambia el flag m, en qué se diferencia del comportamiento predeterminado de los anclajes, cómo se combina con los flags g e i y qué patrones prácticos puedes usar para analizar texto orientado a líneas, como los registros (logs).
Comportamiento predeterminado frente al modo multilínea
De forma predeterminada (sin m), ^ coincide únicamente al principio de todo el string y $ solo al final de todo el string. Un salto de línea (\n) dentro del string es simplemente un carácter más: no crea nuevas posiciones de anclaje.
Con el flag m, ^ también coincide con la posición situada justo después de cada \n, y $ también coincide con la posición situada justo antes de cada \n (además del inicio y el final reales del string). La coincidencia en sí nunca incluye el carácter de salto de línea: los anclajes son posiciones de ancho cero.
Sin m, ^ solo ancla el abc que está al principio del string. Al añadir m, ^ también coincide después del salto de línea, de modo que se encuentran las dos líneas abc. (El flag g es el que recoge todas las coincidencias en lugar de detenerse en la primera.)
El flag m: activar el modo multilínea
Cuando usas el flag m, los anclajes ^ y $ coinciden con las posiciones anteriores y posteriores a los saltos de línea dentro del string.
Uso del flag m
En este ejemplo, gracias al flag m, la expresión regular ^abc coincide con el inicio de cada línea que empieza por "abc". El flag g garantiza que se encuentren todas las apariciones. Sin el flag m, solo coincidiría con "abc" al principio del string.
Ejemplo: coincidencia en varias líneas
Aquí, la expresión regular ^start coincide con el comienzo de las líneas que empiezan por "start" gracias a la combinación de los flags m y g.
Aplicaciones prácticas
Coincidencias al inicio de las líneas en texto multilínea
El flag m es especialmente útil para buscar patrones concretos al principio o al final de cada línea de un string multilínea.
Este ejemplo muestra cómo ^hello con el flag m coincide con "hello" al principio de cada línea.
Coincidencias al final de las líneas en texto multilínea
Del mismo modo, puedes usar el flag m para buscar patrones al final de cada línea.
Aquí, world$ con el flag m coincide con "world" al final de cada línea.
Ejemplo: extraer líneas concretas
Este ejemplo muestra cómo extraer, con el flag m, todas las líneas de un archivo de registro que empiezan por "Error:".
Combinar flags
Puedes combinar el flag m con otros flags para potenciar tus expresiones regulares. Por ejemplo, si combinas el flag m con el flag i (que ignora mayúsculas y minúsculas), puedes hacer búsquedas multilínea sin distinguir entre mayúsculas y minúsculas.
Ejemplo: coincidencia multilínea sin distinguir mayúsculas y minúsculas
En este ejemplo, la expresión regular coincide con las líneas que contienen "hello" sin importar si están en mayúsculas o minúsculas, gracias a la combinación de los flags m e i.
- El patrón
^.*hello.*$coincide con cualquier línea que contenga "hello", sin distinguir mayúsculas de minúsculas. - El flag
mhace que cada línea del string multilínea se trate de forma individual. Hello world,hello worldyHELLO WORLDcoinciden con el patrón porque contienen "hello" (sin distinguir mayúsculas y minúsculas) en algún punto de la línea.
Usa el flag m en las expresiones regulares de JavaScript para aplicar los anclajes ^ y $ a cada línea de un string multilínea y mejorar así tu capacidad de validar y manipular contenido línea por línea.
Usa el flag m para validar línea por línea
El flag m es ideal para los casos en los que necesitas validar o manipular cada línea de forma individual dentro de un string multilínea.
Ejemplo: validar un número de teléfono de EE. UU.
Esta expresión regular comprueba que el número de teléfono tenga el formato (123) 456-7890. Usa ^ para indicar el inicio y $ para indicar el final, de modo que cada línea completa debe ajustarse al patrón especificado.
Así, tanto "(123) 456-7890" como "(234) 567-8901" coinciden con el patrón, porque siguen el formato (xxx) xxx-xxxx para el que se diseñó la expresión regular.
Errores comunes
msolo afecta a^y$, no a.— El punto sigue sin coincidir con un salto de línea. Si necesitas que.también atraviese los saltos de línea, usa el flag independientes(dotAll). El flagmcambia dónde empiezan y terminan las líneas; el flagscambia con qué coincide..mno equivale a buscar palabras completas. Para hacer coincidir los bordes de una palabra en lugar de los de una línea, usa el límite de palabra\ben vez de^/$.- Sin
g,match()devuelve solo la primera coincidencia. El flagmhabilita posiciones de anclaje adicionales, pero sigues necesitandogpara recoger todas las líneas. Combínalos comogm.
Conclusión
El flag m de las expresiones regulares de JavaScript amplía la funcionalidad de los anclajes ^ y $ para que coincidan con el inicio y el final de cada línea de un string multilínea. Esta capacidad es muy valiosa para procesar datos de texto con varias líneas, ya que permite buscar patrones y validar contenido de forma precisa, línea por línea.