Outros Metacaracteres

Deixando as âncoras em nossa memória, agora já sabemos como casar algo, em alguma quantidade, em algum lugar na linha. Então vamos ver outros metacaracteres que têm funções específicas e não relacionadas entre si e, portanto, não podem ser agrupados em outra classe fora a tradicional “outros”.

Escape: \

Como fazer para o metacaractere * ser literal?

Se você quiser que um metacaractere vire um caractere normal, coloque-o dentro de uma lista (tá lembrado né?), então lua[*] casa lua*. O mesmo serve para qualquer outro metacaractere. Maaaaaa+s, para não precisar ficar toda hora criando listas de um único componente só para tirar seu valor especial, temos o metacaractere escape \ , que “escapa” um metacaractere, tirando todos os seus poderes.

Sabe a criptonita? Sim! do super-homem. O escape tem o mesmo poder. É só você colocar ele após um metacaractere, e ele vira um caractere normal, fraco, sem poder também. Escapando, * é igual a [*] que é igual a um asterisco literal. Similarmente podemos escapar todos os metacaracteres já vistos:

\. \[ \] \? \+ \{ \} \A \$

O escape é tão poderoso que pode escapar a si próprio! O \ casa uma barra invertida \ literal. Escapar um circunflexo ou cifrão somente é necessário caso eles estejam em suas posições especiais, como casar o texto ^destaque^, em que ambos os circunflexos são literais, mas o primeiro será considerado uma âncora de começo de linha caso não esteja escapado.

Exercício

Ou: |

É muito comum em uma posição específica de nossa ER termos mais de uma alternativa possível, por exemplo, ao casar um cumprimento amistoso, podemos ter uma terminação diferente para cada parte do dia: boa-tarde|boa-noite.

Grupo

O ou, representado pela barra vertical |, serve para esses casos em que precisamos dessas alternativas.

Essa ER se lê: “ou boa-tarde, ou boa-noite”; ou seja, “ou isso ou aquilo”. Lembre-se de que a lista também é uma espécie de ou, mas apenas para uma letra, então: [gpr]ato é gato|pato|rato

São similares, embora nesse caso, em que apenas uma letra muda entre as alternativas, a lista é a melhor escolha.

Exemplos

É útil casarmos um endereço de Internet, que pode ser uma página ou um servidor FTP.

egrep '(http://|ftp://)' <arquivo>

Ou isso ou aquilo, ou aquele outro… E assim vai. Podem-se ter tantas opções quantas for preciso.

Grupo: ( )

O grupo tem o dom de juntar vários tipos de sujeitos em um mesmo local. Dentro de um grupo, podemos ter um ou mais caracteres, metacaracteres e inclusive outros grupos!

Como em uma expressão matemática, os parênteses definem um grupo, e seu conteúdo pode ser visto como um bloco na expressão.

Todos os metacaracteres quantificadores que vimos anteriormente podem ter seu poder ampliado pelo grupo, pois ele lhes dá mais abrangência. E o ou, pelo contrário, tem sua abrangência limitada pelo grupo: pode parecer estranho, mas é essa limitação que lhe dá mais poder.

Em um exemplo simples, (ai)+ agrupa a palavra “ai” e esse grupo está quantificado pelo mais. Isso quer dizer que casamos várias repetições da palavra, como ai, aiai, aiaiai,… E assim podemos agrupar tudo o que quisermos, literais e metacaracteres, e quantificá-los:

Expressão Match
(ha!)+ ha!, ha!ha!, ha!ha!ha!, …
(\.[0-9]){3} .0.6.2, .2.8.9, .7.7, …
(www\.)?zz\.com www.zz.com, zz.com

E em especial, nosso amigo “ou”…

Grupo

Expressão Match
boa-(tarde|noite) boa-tarde, boa-noite
(#|n\.|núm) 7 # 7, n. 7, núm 7
(in|con)?certo incerto, concerto, certo

Note que o grupo não altera o sentido da ER, apenas serve como marcador. Podemos criar subgrupos também.

exemplos

Imagine que você esteja procurando o nome de um supermercado em uma listagem e não sabe se este é um mercado, supermercado ou um hipermercado.

egrep '(super|hiper)mercado' <arquivo>

Essa ER consegue casar as duas últimas possibilidades, mas note que nas alternativas super e hiper temos um trecho em comum aos dois, então podíamos agrupar apenas as diferenças su e hi:

egrep '(su|hi)permercado' <arquivo>

Precisamos também casar apenas o mercado sem os aumentativos, então temos de agrupá-los e torná-los opcionais:

egrep ((su|hi)per)?mercado

Pronto! Temos a ER que buscávamos e ainda esbanjamos habilidade utilizando um grupo dentro do outro.

Exercícios

Retrovisor: \1 … \9

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!.

Confuso né? presta atenção!

Vamos começar 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 ;) :

egrep '(quero)-\1' <arquivo>

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.

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 no pulo do gato? Podemos ter no máximo nove retrovisores por ER, então \10 é o retrovisor número 1 seguido de um zero.

Exercícios

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

Mais detalhes

Como já dito, podemos usar no máximo nove retrovisores. Vamos ver uns exemplos e viajar com mais de um de nossos amigos novos. É fundamental que você entenda todos:

Expressão Match
(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

Grupo

Para não se perder nas contagens, dica: 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.

Nos nossos exemplos 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.

  1. Escape
    1. O escape escapa um metacaractere, tirando seu poder.
    2. \* = [*] = asterisco literal.
    3. O escape escapa o escape, escapando-se a si próprio simultaneamente.
  2. Ou
    1. O ou indica alternativas.
    2. Lista para um caractere, ou para vários.
  3. Grupo
    1. Grupos servem para agrupar.
    2. Grupos são muito poderosos.
    3. Grupos podem conter grupos.
    4. Grupos são quantificáveis.
  4. Retrovisor
    1. O retrovisor só funciona se usado com o grupo.
    2. O retrovisor serve para procurar palavras repetidas.
    3. Numeram-se retrovisores contando os grupos da esquerda para a direita.
    4. Temos no máximo 9 retrovisores por ER.