er.txt 19991026 PROPOSTA -------- este documento se propõe a apresentar as Expressões Regulares aos leitores. O que são, de onde vieram e pra quê servem. Dar exemplos de uso e explicar o funcionamento básico. tentarei não me aprofundar muito em tópicos específicos para poder dar um visão geral e prática do assunto. para detalhes técnicos e mais informações, consulte a bíblia: "Mastering Regular Expressions" Jeffrey E. F. Friedl - O'Reilly ou ainda: man ed man egrep man awk man regexp http://python.org/doc/howto/regex http://www.conectiva.com.br/~aurelio/doc/er.txt INTRODUÇÃO ---------- Expressões Regulares (abreviando ERs), são a chave para um processamento de texto flexível, poderoso e eficiente. servem para automatizar tarefas repetitivas e conseguem ser tão precisas quanto se necessite. O QUE SÃO ERs? -------------- são símbolos, caracteres com funções especiais, que agrupados, entre si e com caracteres literais, formam uma seqüência, uma expressão. esta expressão é interpretada como uma regra, que indicará sucesso se uma entrada de dados qualquer "casar" com esta regra, obedecer exatamente todas as suas condições. é como uma receita culinária, com seus ingredientes e uma ordem correta para adicioná-los à mistura. HISTÓRIA -------- os conceitos surgiram primeiramente no início da década de 40, num artigo que teorizava o funcionamento dos neurônios, e nos próximos 25 anos, foram discutidos e desenvolvidos por matemáticos. a primeira publicação sobre ERs em computadores data de 1968, num artigo de Ken Thompson, "Regular Expression Search Algorithm". com este trabalho, ele fez o 'qed', um editor que foi a base do 'ed', editor de texto padrão do UNIX. o comando do ed "g/Regular_Expression/p" que literalmente significa "Global Regular Expression Print", era tão útil que ganhou seu próprio aplicativo: 'grep'. o grep por sua vez, teve melhoramentos e adições em suas ERs e se tornou: 'egrep'. outros programas que utilizavam ERs também foram aparecendo, como 'awk', 'lex' e 'sed' e para padronizar a implementação e uso de ERs por eles, estas foram inclusas na biblioteca C básica, para qualquer programa fazer uso. o 'egrep' será a ferramenta principal utilizada para exemplificar o uso das ERs por ser recente e suportar ERs de uma forma mais limpa e flexível, na linha de comando, sem precisar "escapar" os caracteres especiais (mais detalhes adiante). CONCEITOS CONHECIDOS -------------------- alguns conceitos de ERs já são usados e assimilados por muitos usuários de computadores, como por exemplo os conceitos de alternativas e caracteres com significados especiais. este ocorre por exemplo com o '*', quando você pede a listagem dos arquivos com a extensão .html. na linha de comando, executando: ls *.html dir *.html ou no ambiente gráfico, na caixa de texto de filtragem de nomes de arquivos: +--------------------+ | *.html | +--------------------+ o asterisco '*' (também chamado de estrela) nesse caso lê-se "tudo", ou "qualquer coisa", então você quer listar "qualquer coisa com a extensão html". um outro caractere especial utilizado de maneira similar é a interrogação '?', que casa um caractere qualquer. então: ls aula??.html casa com: aula__.html aula01.html aulaDF.html ... as alternativas, são muito usadas na linha de comando em sistemas unix, para especificar mais de um padrão de nome de arquivo: cp aula.{html,txt,sgml} /tmp onde o nome do arquivo casa com: aula.html aula.txt aula.sgml só para complementar, uma relação de similaridade linha de comando : '*', '?' e '{a,b,c}' expressões regulares: '.*', '.' e '(a|b|c)' CARACTERES ESPECIAIS (METACARACTERES) ------------------------------------- há um grupo básico de caracteres especiais, chamados metacaracteres, que a maioria dos programas que implementam ERs utilizam, mas como é de se esperar, alguns têm leves mudanças de comportamento ou precisam ser "escapados". para escapar um caractere, tal qual na linha de comando, basta precedê-lo de uma barra invertida '\'. essas diferenças podem confundí-lo num primeiro momento e podem tornar sua ER não tão portável, mas não vivemos num mundo perfeito... &:) um bom exemplo é o quantificador '+', que no egrep é literalmente '+', porém no grep, que é mais antigo, e sempre teve o sinal de adição como um caractere normal, ao colocar suporte a esse quantificador, o representaram escapado '\+', para não quebrar a compatibilidade com as versões anteriores. pergunta: e no egrep, que o '+' é quantificador, como fazer para representar um '+' literal? basta escapá-lo. aqui chegamos numa peculiaridade que quem usa ERs que tem aprender a se acostumar: | grep | egrep ----------------+------+------- + literal | + | \+ + quantificador | \+ | + #:TODO ------------> explicar e exemplificar progressivamente os metacaracteres como o egrep será utilizado nos exemplos, abaixo segue uma tabela com um resumo de seus metacaracteres básicos e suas funções respectivas: RESUMO DOS METACARACTERES DO EGREP ---------------------------------- PARA CASAR UM CARACTERE: . ponto um caractere qualquer [] classe de caracteres um caractere da classe [^] classe de carac. negada um caractere fora os da classe QUANTIFICADORES: ? opcional zero ou um * asterisco zero, um ou mais + sinal de adição um ou mais ANCORAS: ^ circunflexo início da linha $ dólar fim da linha OUTROS: | alternativas ou um ou outro () agrupamento coloca expressões num bloco ACENTUAÇÃO ---------- e como fica nossa acentuação com as REs? a classe de caracteres '[a-z]' engloba caracteres acentuados? não. essa é fácil de entender, pois esse intervalo da classe de caracteres, 'a-z' é baseado na tabela ASCII, que segue esta ordem: ...ABCD...XYZ...abcd...xyz...ÀÁ...ÙÚ...àá...ùú... então o intervalo 'A-z' casa todas as letras do alfabeto, maiúsculas e minúsculas, sem acentuação. para englobar as letras acentuadas também, use o intervalo 'A-ú'. exemplos rápidos com sed (o que casar, não aparecerá na saída): echo 'AaÁáEeÉéIiÍíOoÓóUuÚú' | sed 's/[a-z]//g' echo 'AaÁáEeÉéIiÍíOoÓóUuÚú' | sed 's/[A-z]//g' echo 'AaÁáEeÉéIiÍíOoÓóUuÚú' | sed 's/[Á-Ú]//g' echo 'AaÁáEeÉéIiÍíOoÓóUuÚú' | sed 's/[A-ú]//g'