Ver Indice Geral da Apostila de Expressões Regulares
Outros Metacaracteres
Vamos dar uma olhada em alguns outros metacaracteres
| Outros Metacaracteres |
| \ | Usado para escrever o valor literal de um metacaractere |
| | | Indica "ou". |
| ( ) | Agrupa caracteres |
O Metacaractere \
Imagine que procures pela palvra "*nix" em um texto, mas o "*" é um metacaractere se usarmos ele será interpretado como metacaractere.
Então como fazer quando eu precisar procurar pelo caractere "*"?
Para isso usamos o Metacactere \. A \ anula o efeito do metacactere que vem logo após ela.
Para entender melhor crie um arquivo chamado "especiais" com o seguinte conteúdo:
| especiais |
asterisco*asterisco
barra\invertida
chapeu^chapeu
*nix
|
Agora vamos ver o \ em ação.
| Digite no Terminal |
grep -wE "\*.*" especiais
|
| Mostrará na tela |
|
*nix
|
Assustador?
Não é não, vamos com calma
O \* indica que a palavra procurada começa com *
O .* indica qualquer caractere e em qualquer quantidade
Então "\*.*" indica: qualquer palavra que comece por "*"
Como imprimir todas linhas que tenham \? Basta usar \\.
Veja:
| Digite no Terminal |
grep -wE '.*\\.*' especiais
|
| Mostrará na tela |
|
barra\invertida
|
Mais uma vez o código parece confuso, mas é simples
.* significa qualquer caracter em qualquer quantia
\\ significa uma barra \
.* novamente temos qualquer caracter em qualquer quantia
Então '.*\\.*' busca uma palavra que possua uma barra no meio dessa palavra :D
O Metacaractere |
O | pode ser entendido como "ou".
Vamos voltar a nossa lista de nomes, imagine que queira buscar o nome "maria" e o nome "carlos"
| Digite no Terminal |
grep -wE 'maria|carlos' ER
|
| Mostrará na tela |
maria
carlos
|
Ou seja, na linha que possua "maria" ou "carlos" o Grep imprime.
Essa opção de "ou" é mais usada com o metacaractere que agrupa caracteres, que vamos ver agora
O Metacaractere ( )
Imagine agora que queremos buscar por "marina" "mariana" e "mariane".
Usando somendo o metacaractere | ficaria:
| Digite no Terminal |
grep -wE 'marina|mariana|mariane' ER
|
Ficou meio longo não?
O exemplo é pequeno, mas existem ocasiões que digitando ficaria bem longo.
Imagina ter que digitar tudo?
Por isso usamos o ( ), repare que as 3 palavras começam exatamente iguais, começam com "mari".
Então escrevemos "mari" e colocamos a possíveis terminações.
Veja:
| Digite no Terminal |
grep -wE 'mari(na|ana|ane)' ER
|
O grep busca todas palavras que comecem com "mari" em seguida analisa se a palavra contém uma das 3 terminações pedidas.
E se eu quiser que escreva a palavra "mari" também?
Simples, basta pôr um "|" sem nada.
| Digite no Terminal |
grep -wE 'mari(|na|ana|ane)' ER
|
| Mostrará na tela |
mari
marina
mariana
mariane
|
E se eu quiser que apareça outros nomes junto?
Por exemplo "carlos" e "carla". Dá?
Mas é claro que dá meu jovem discípulo.
Veja como fica:
| Digite no Terminal |
grep -wE 'mari(|na|ana|ane)|car(los|la)' ER
|
| Mostrará na tela |
mari
marina
mariana
mariane
carlos
carla
|
Dá para usar um ( ) dentro de outro ( )?
Se você pensou em agrupar o "e" e o "a" depois do "an" de "mariana" e "mariane" dentro da própria lista, pensou bem. Mas essa não é a melhor solução ;)
Vejamos como fica dessa maneira.
| Digite no Terminal |
grep -wE 'mari(|na|an(a|e))|car(los|la)' ER
|
Confuso não?
temos um prefixo "mari" em seguida o grep testa as opções dentro do ( ).
Quando ele chega em "an", ele mantém "marian" e testa com as terminações "a" e "e".
Lembra do nosso amigo [ ]?
Ele seleciona possíveis caracteres, ele se aplica melhor nesse trabalho
Veja:
| Digite no Terminal |
grep -wE 'mari(|na|an[ae])|car(los|la)' ER
|
Nossa linha ficou menor e mais legível
Mesmo assim acho que, nesse caso, a melhor solução seria a linha:
grep -wE 'mari(|na|ana|ane)|car(los|la)' ER
Essa linha é mais longa, mas também é mais fácil de entender ;)
E a diferença de tamanho entre elas também não é tão significativa.
Lembre-se que o menor nem sempre é o melhor, muitas vezes devemos optar pelo que fica mais fácil entender.
Nota: 10
Postado em: 2008-05-20
Ver Indice Geral da Apostila de Expressões Regulares