Algumas linguagens possuem modificadores para que sua ER consiga
lidar com um texto de várias linhas. Geralmente são dois os
modificadores, um para tratar estas várias linhas como apenas uma, em
que o metacaractere ponto também casa o \n
(quebra de
linha), e outra complementar para tratar como várias linhas, onde o
circunflexo e o cifrão podem casar começo e final de qualquer uma
dessas linhas contidas no texto, chamado multilinha. Vejamos:
$a = $b = $c = "linha 1\nlinha 2\nlinha 3"; $a =~ s/^.*/!!/g ; print "$a\n-------\n"; $b =~ s/^.*/!!/gs; print "$b\n-------\n"; $c =~ s/^.*/!!/gm; print "$c\n-------\n"; # RESULTADO (normal, uma linha, multilinha) !! linha 2 linha 3 ------- !! ------- !! !! !! -------
Ah, nada como um exemplo para ilustrar conceitos... Esse trecho em
Perl casa a ER ^.*
no texto de três linhas,
fazendo substituições globais (modificador g
), primeiro
normal, depois com o modificador uma linha, e depois o multilinha.
Como era de se esperar, o primeiro, como não sabe o que é multilinha casou apenas a primeira e não tocou nas outras linhas.
O segundo, como o ponto casa a quebra de linha, considerou o texto
todo como apenas uma única linha e casou tudo, trocando todas por
apenas um !!
.
Já o último, que é multilinha, considerou o \n
o fim
de uma linha e casou as três linhas separadamente.