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