Índice Anterior Próxima

Retrovisor: o saudosista \1 ... \9

Está gostando da leitura? Está aprendendo? Compre o livro novo que traz mais conteúdo, texto atualizado e ilustrações!

Já vimos o poder do grupo, e várias utilidades em seu uso. Mas ainda não acabou! Se prepare para conhecer o mundo novo que o retrovisor nos abre. Ou seria mundo velho?

Ao usar um (grupo) qualquer, você ganha um brinde, e muitas vezes nem sabe. O brinde é o trecho de texto casado pela ER que está no grupo, que fica guardado em um cantinho especial, e pode ser usado em outras partes da mesma ER!

Mmmmmmmmmm, ficou meio confuso

Então vamos tentar de novo. Como o nome diz, é retrovisor porque ele "olha pra trás", para buscar um trecho já casado. Isso é muito útil para casar trechos repetidos em uma mesma linha. Veja bem, é o trecho de texto, e não a ER.

Como exemplo, em um texto sobre passarinhos, procuramos o quero-quero. Podemos procurar literalmente por quero-quero , mas assim não tem graça, pois somos mestres em ERs e vamos usar o grupo e o retrovisor para fazer isso:

(quero)-\1

Então o retrovisor \1 é uma referência ao texto casado do primeiro grupo, nesse caso quero, ficando, no fim das contas, a expressão que queríamos. O retrovisor pode ser lembrado também como um link ou um ladrão, pois copia o texto do grupo.

Mas esse \1 não é o tal do escape?

Pois é, lembra que o escape \ servia para tirar os poderes do metacaractere seguinte. Então, a essa definição agora incluímos: a não ser que este próximo caractere seja um número de 1 a 9, então estamos lidando com um retrovisor.

Notou o detalhe? Podemos ter no máximo 9 retrovisores por ER, então \10 é o retrovisor número 1 seguido de um zero. Alguns aplicativos novos permitem mais de nove.

Não era muito mais fácil escrever quero-quero direto?

Nesse caso sim. Mas este é só um exemplo didático. O verdadeiro poder do retrovisor é quando não sabemos exatamente qual texto o grupo casará. Vamos estender nosso quero para "qualquer palavra":

([A-Za-z]+)-\1

Percebeu o poder dessa ER? Ela casa palavras repetidas, separadas por um traço, como o próprio quero-quero, e mais: bate-bate , come-come, etc. Mas, e se tornássemos o traço opcional?

([A-Za-z]+)-?\1

Agora, além das anteriores, nossa ER também casa bombom, lili, dudu, bibi e outros apelidos e nomes de cachorro.

Com uma modificação pequena, fazemos um minicorretor ortográfico para procurar por palavras repetidas como como estas em um texto:

([A-Za-z]+) \1

Mas lembre-se que procuramos por palavras inteiras e não apenas trechos delas, então precisamos usar as bordas para completar nossa ER:

\b([A-Za-z]+) \1\b

Legal né? Note como vamos construindo as ERs aos poucos, melhorando, testando e não simplesmente escrevendo tudo de uma vez. Esta é a arte ninja de se escrever ERs.

Mais detalhes

Como já dito, podemos usar no máximo nove retrovisores. Vamos ver uns exemplos com mais de um de nossos amigos novos:

(lenta)(mente) é \2 \1	lentamente é mente lenta
((band)eira)nte \1 \2a	bandeirante bandeira banda
in(d)ol(or) é sem \1\2	indolor é sem dor
((((a)b)c)d)-1 = \1,\2,\3,\4	abcd-1 = abcd,abc,ab,a

Para não se perder nas contagens, há uma dica valiosa: conte somente os parênteses que abrem, da esquerda para a direita. Este vai ser o número do retrovisor. E o conteúdo é o texto casado pela ER do parêntese que abre até seu correspondente que fecha.

O retrovisor referencia o texto casado e não a ER do grupo.

Nos nossos exemplos acima ocorre a mesma coisa porque a ER dentro do grupo já é o próprio texto, sem metacaracteres. Veja, entretanto, que ([0-9])\1 casa 66 mas não 69.

E se eu colocar um retrovisor em uma ER que não tem grupo?

Vai dar pau &:)

Apenas como lembrete, algumas linguagens e programas, além da função de busca, têm a função de substituição. O retrovisor é muito útil nesse caso, para substituir "alguma coisa" por "apenas uma parte dessa coisa", ou seja, extrair trechos de uma linha. Mais detalhes sobre isso adiante.

Resumão


Índice Anterior Próxima