Expressões regulares
Como "farejar" um texto e aumentar a produtividade
Aurélio M. Jargas
Este artigo se propõe a fazer uma introdução às Expressões Regulares e sua utilidade, tentando desmistificar a dificuldade a que sempre estão associadas. Serão evitados ao máximo os termos técnicos e será dado um exemplo didático da vida real (correção ortográfica), para ilustrar melhor os conceitos. Serão apresentados apenas os metacaracteres mais utilizados e não serão mencionados alguns detalhes que, apesar de corretos, dificultariam um pouco o aprendizado. Em artigos posteriores esses detalhes serão vistos mais a fundo.
Uma Expressão Regular (ER) é uma construção que utiliza pequenas ferramentas, feita para obter uma determinada seqüência de caracteres de um texto. Embora abstrata e vaga demais, ao final deste artigo essa definição ficará mais clara.
As ERs são poderosas e podem aumentar em muito a produtividade, sendo o conhecimento de seu uso indispensável a um administrador de sistemas. Elas também podem poupar tempo do usuário na busca por informações ou em tarefas complexas.
Vários programas e linguagens de programação têm suporte para ERs, como grep, egrep, find, sed, awk, lex, perl, tcl e python e também alguns editores de texto como ed, vi e emacs.
Na grande maioria dos editores de texto existentes há uma função de busca que permite procurar por uma palavra no texto em edição. Digita-se a palavra e esse mecanismo procura, sem opções (ou complicações, como muitos diriam).
Alguns editores, com uma busca um pouco mais esperta, permitem a procura ignorando a diferença entre letras maiúsculas e minúsculas, através do uso de um curinga, geralmente o asterisco (*), que significa "qualquer coisa". Este também funciona na linha de comando, pois quando você faz um ls *.txt, está listando "todos os arquivos com a extensão .txt".
Editores de texto mais profissionais têm suporte para ERs e permitem o uso de uma série de metacaracteres, que são caracteres especiais que assumem uma função ao invés de seu valor literal (como o curinga * já citado). Uma ER é formada por metacaracteres e caracteres literais, mas para simplificar a demonstração dos conceitos, os caracteres literais serão representados apenas com letras, embora também possam ser números e símbolos (,%!~'#...).
Encare os metacaracteres como pequenas ferramentas (e assim serão referidos no restante do texto). Cada uma delas possui uma função específica, que pode variar com o contexto no qual está inserida, e essas funções podem ser agregadas e aninhadas umas com as outras, produzindo expressões muito poderosas. Vamos dar uma olhada em algumas dessas ferramentas, como ., [ ], * e +.
Suponhamos que você esteja editando um texto e queira procurar pela palavra "Fim", mas não se lembra se ela começava com f ou F. Você pode usar uma ER para procurar pelos dois casos de uma só vez. A ER seria `.im'. O ponto é uma ferramenta que casa, termo que pode significar representa ou compara, "qualquer letra", mas apenas uma vez. Então, poderíamos obter como resposta, além do "Fim" e "fim" desejados, "sim", "mim", "rim" etc. Ou seja, chegamos à conclusão de que nossa ER não é específica o suficiente.
Vamos agora começar a trabalhar a ER, refiná-la, torná-la mais precisa. Sabendo que "Fim" podia ter um f maiúsculo ou minúsculo, e nada diferente disso, ela poderia ser descrita por ` Ff im'. Os colchetes são uma ferramenta também. Como o ponto, casam uma única vez, mas casam apenas "qualquer das letras entre os colchetes".
Assim especificamos nos colchetes quais letras são válidas numa determinada posição. Então estamos procurando por um F _ou_ um f, seguido de um i, seguido de um m.
E se você quisesse procurar por letras repetidas? Por exemplo, aa, aaa, aaaa etc. Num editor de textos normal você procuraria cada possibilidade uma a uma. Com ERs, você pode simplesmente informar `aa*'. O asterisco aqui não funciona como o curinga anterior, "qualquer letra". Em ERs, o asterisco é um quantificador, ou seja, indica que a entidade imediatamente anterior (nesse caso a letra a) pode aparecer várias vezes. Mas o * também casa zero vezes, então nossa expressão `aa*' também casaria um a (uma letra a, seguida de outra letra a zero vezes). Poderíamos fazer `aaa*', que sempre casaria um mínimo de duas letras a, mas temos um outro quantificador, o +. O sinal de adição funciona da mesma maneira que o *, só que ele casa a entidade imediatamente anterior uma ou mais vezes. Então ficaríamos com `aa+', ou seja, uma letra a, seguida de outra letra a que apareça uma ou mais vezes.
Então até aqui vimos quatro ferramentas:
| . | qualquer letra uma vez |
| [ ] | qualquer das letras dentro dos colchetes uma vez |
| * | quantificador: anterior zero ou + vezes |
| + | quantificador: anterior uma ou + vezes |
Bem, agora que já sabemos o básico de ERs, como faríamos para resolver um problema cotidiano com elas?
Você escreveu um texto, uma redação, um manual. Como fazer checagens ortográficas rápidas, procurando erros comuns como:
Vamos às respostas:
TÁTICA 1: procurar um sinal de pontuação seguido de uma letra
ER: ` ?!.:; A-Za-z ' ou seja, procure por: ?, ou !, ou ., ou :, ou ;, seguido imediatamente por uma letra entre A e Z ou uma
letra entre a e z. Aqui temos um problema, pois acabamos perdendo erros como sinais seguidos de números, ou sinais repetidos
como ??.
Conceito novo: Internvalo
Dentro dos colchetes, dois caracteres com um hífen (-) entre eles significa um intervalo. Então `A-Z' é o mesmo que
"ABCDEFGHIJKLMNOPQRSTUWXYZ". Idem para `a-z'.
TÁTICA 2: procurar um sinal de pontuação seguido de qualquer coisa menos um espaço em branco
ER: ` ?!.:; ^ ' ou seja, procure por: ?, ou !, ou ., ou :, ou ;, seguido imediatamente por qualquer coisa fora um espaço em
branco.
Conceito novo: negação.
Dentro dos colchetes, se o primeiro caracter for um sinal de acento circunflexo (^), o significado dos colchetes muda para
"qualquer letra, exceto as de dentro dos colchetes".
TÁTICA 1: procurar um sinal de pontuação, um espaço em branco e uma letra minúscula
ER: ` ?!. a-z ' ou seja, procure por: ?, ou !, ou ., seguido de um espaço em branco, seguido de uma letra minúscula entre a e z
TÁTICA 2: procurar um sinal de pontuação, um espaço em branco e qualquer coisa menos uma letra maiúscula ER: `???' essa fica de exercício para o leitor.
Expostos os conceitos e dados alguns exemplos, aqui vão alguns exercícios para estimular sua imaginação. São todos simples, e não devem tomar muito de seu tempo, então pare de correr um pouco e tente fazê-los. Escreva, utilizando apenas os conceitos aprendidos, uma ER para casar:
Como se pode constatar por essa introdução às Expressões Regulares, depois de entendido o conceito, o importante é praticar. Espero que este artigo tenha ajudado a esclarecer os pontos mais importantes relacionados a ERs, o que são e por que utilizá-las.
Aquela definição do início do texto está mais clara agora?
"...uma ER é uma construção, que utiliza pequenas ferramentas, feita para obter uma determinada seqüência de caracteres de um texto."
As respostas para os exercícios estão em www.conectiva.com.br/~aurelio/er
Há uma lista de discussão em português sobre sed (ferramenta manipuladora de texto, com uso intensivo de ERs), em que podem ser tiradas dúvidas sobre ERs. Para se inscrever, mande um e-mail para sed-br-subscribe@egroups.com
Tabela de comparação com os curingas do shell (bash e DOS)
|
Para saber mais
|