O modo multilinha é ativado pela opção pattern:m
.
Ela afeta apenas o comportamento do pattern:^
e pattern:$
.
No modo multilinha, eles não correspondem somente ao começo e o fim de uma string, mas também ao começo e o fim de linhas.
O exemplo abaixo tem várias linhas. O padrão pattern:/^\d/gm
corresponde a um caractere no começo de cada linha:
let str = `1st place: Winnie
2nd place: Piglet
3rd place: Eeyore`;
*!*
console.log( str.match(/^\d/gm) ); // 1, 2, 3
*/!*
Sem a opção pattern:m
somente o primeiro dígito será encontrado:
let str = `1st place: Winnie
2nd place: Piglet
3rd place: Eeyore`;
*!*
console.log( str.match(/^\d/g) ); // 1
*/!*
Isso acontece porque por padrão, o acento circunflexo pattern:^
corresponde apenas com o começo da string -- e no modo multilinha no começo de cada linha.
Formalmente, "começo de linha" quer dizer "imediatamente após uma quebra de linha": o teste `pattern:^` no modo multilinha corresponde a todas as posições precedidas por um caractere de nova linha `\n`, bem como o início da string como um todo.
O cifrão pattern:$
se comporta de maneira similar.
A expressão regular pattern:\d$
corresponde ao último dígito de cada linha
let str = `Winnie: 1
Piglet: 2
Eeyore: 3`;
console.log( str.match(/\d$/gm) ); // 1,2,3
Sem a opção pattern:m
, o cifrão pattern:$
corresponde apenas ao fim da string inteira, então apenas o último dígito seria encontrado.
Formalmente, "fim de linha" quer dizer "imediatamente antes de uma quebra de linha": o teste `pattern:$` no modo multilinha corresponde a todas as posições sucedidas por um caractere de nova linha `\n`, bem como o fim da string como um todo.
Para encontrar uma quebra de linha, podemos usar não apenas as âncoras pattern:^
e pattern:$
, mas também o caractere de nova linha \n
.
Qual a diferença? Vejamos um exemplo.
Aqui estamos buscando por pattern:\d\n
ao invés de pattern:\d$
:
let str = `Winnie: 1
Piglet: 2
Eeyore: 3`;
console.log( str.match(/\d\n/g) ); // 1\n,2\n
Como podemos ver, temos duas correspondências ao invés de 3
Isso ocorre porque não há uma quebra de linha após o subject:3
(Mas temos o fim da string, então ele corresponde com o pattern:$
)
Outra diferença: Agora cada correspondência inclui um caractere de nova linha match:\n
. Diferentemente das âncoras pattern:^
e pattern:$
, que testam apenas a condição (início ou fim de uma linha), \n
é um caractere, então ele se torna parte do resultado.
Dessa forma, usamos o \n
no padrão quando precisamos de caracteres de nova linha no resultado, e usamos âncoras quando precisamos buscar algo no começo ou final de uma linha.