02/10/2004 - Por Preceptor
Criando e aprendendo a usar Expressões Regulares
Nota dos usuários:
Visualizações: 3745 visualizações.
Lista de páginas desta publicação:
Expressões Regulares
A compreensão do funcionamento das Expressões Regulares e dos operadores e funções relacionados a manipulação dessas expressões, na Perl, é um dos passos fundamentais para a programação rápida e eficiente que nos é proporcionada por essa linguagem extremamente flexível e produtiva.
Pode-se dizer de uma Expressão Regular, que ela é uma "regra" que permite descrever, precisamente, todos os elementos de um conjunto, seja este finito ou infinito, sem a necessidade de enumerá-los explicitamente. Por exemplo, a expressão regular '^0-9$' descreve os algarismos de 0 a 9 e a expressão '^a-zA-Z$', as letras maiúsculas e minúsculas do alfabeto, incluindo-se "k" ou "K", "w" ou "W" e "y" ou "Y".
Nesse artigo, irei descrever como elaborar expressões regulares e como aplicá-las na solução de problemas computacionais. Explicarei, também, o comportamento do sub-grupo (não todos eles) das estruturas de dados, das funções e dos operadores que têm sua operação baseada na avaliação de expressões regulares.
1. Elaborando Expressões Regulares
A elaboração de uma expressão regular é feita através de caracteres e metacaracteres. Os caracteres irão sempre descrever elementos explícitos e os metacaracteres, elementos implícitos e as condições em que esses elementos ocorrem dentro de um conjunto. Como exemplo, vamos tomar duas expressões regulares: '^a{1,2}$' e '^(a|b){1,3}$'. A primeira, descreve o cojunto que contém dois elementos, sendo eles "a" e "aa". Já a segunda expressão, descreve o cojunto com os elementos "a", "aa", "aaa", "b", "bb" e "bbb". Estas duas expressões são formadas pelos caracteres "a" e "b", utilizados para compor os elementos do conjunto, e pelos metacaracteres "{}", "()", "|", "^" e "$" que determinam como devem ser feito as composições. O metacaracter formado pelos símbolos "{}", é um quantificador que define a quantidade de vezes que um caracter irá ocorrer em um elemento. No primeiro exemplo, ele especifica que os elementos que constituem o conjunto, descrito pela expressão em questão, serão compostos apenas por uma ou duas ocorrências do caracterer "a". Ainda no primeiro exemplo, existem dois outros metacaracteres, "^" e "$". A função deles, é definir fronteiras, o que significa que os elementos devem ser formados iniciando pelo caracter ou a composição de caracteres que segue o símbolo "^" e terminados pelo caracter ou a composição que antecede "$". Exemplificando, a expressão '^a{1,2}' descreve o conjunto cujos os elementos iniciam com um ou dois caracteres "a", ou seja, um conjunto infinito de elementos. Da mesma forma, a expressão 'a{1,2}$' irá definir um conjunto infinito, e também infinito, porém maior ainda, será o conjunto descrito pela expressão 'a{1,2}' que não estabelece nenhuma fronteira. Em outras palavras, essa expressão irá descrever o conjunto de elementos formados por um subconjunto de caracteres, sendo eles "a" e "aa". É sempre bom estar atento a peculiaridades como essa para não cometer erros na elaboração de expressões. Outro exemplo de expressão regular peculiar é '^[^-_0-9]'. Há duas peculiaridades nessa expressão, tente descobrir quais. Uma delas, será esclarecida nos próximos capítulos, já a outra, você terá que recorrer às referências bibliográficas. :-)
Uma expressão regular pode ser composta por caracteres, metacaracteres ou pela combinação de ambos. Quando formada apenas por caracteres, ela irá sempre descrever o conjunto de elementos que possuem ao menos esses caracteres. A expressão 'ch', por exemplo, pode ser usada para descrever o conjunto de palavras que são grafadas com o dígrafo "ch". Já a expressão '^ch', descreveria por sua vez o conjunto das palavras que iniciam com esse dígrafo. De maneira análoga a expressão '(ss|rr)(a|e)' ou '(ss|rr)ae' enumeraria as palavras contendo as sílabas "ssa", "sse", "rra" e "rre". Outras composições equivalentes seriam: '(s|r)(a|e)' ou 'srae'.
Atenção, existe uma grande diferença entre as expressões '(s|r)' e 's|r'. Essa última, enumeraria os elementos "s", "r" e "rr". Também entre 'sr{1,2}' e '(sr){1,2}', há uma boa diferença, veja os conjuntos descritos por ambas: "sr", "srr" e "sr", "srsr". O metacaracter agrupador "()" faz com que o metacaracter que o segue afete o grupo de caracteres como um todo e não individualmente.
Bem, creio que nesse ponto a idéia de conjuntos descritos através de um "regra", a Expressão Regular, deva estar bem elucidada. E para quem nunca havia lidado com expressões regulares, talvez, em algum momento, tenha esbarrado com alguma, pois elas são utilizadas por diversos programas (grep, sed, awk, vi, apache, proftpd, squid, etc.) e liguangens de programação (C, python, php, java e outras). E a razão de tamanha difusão, é o fato de serem aplicáveis na solução de um vasto número de problemas computacionais, cuja a solução se torna simplificada, e portanto, fácil de implementar mas sem comprometer o desempenho da aplicação.
2. Metacaracteres
A Perl possui vários metacaracteres para composição de expressões regulares, esses derivados das rotinas de expressões regulares, versão 8. Nesse artigo, não irei descrever todos, apenas os mais importantes. Consulte a referência bibliografica ao final desse artigo, caso deseje conhecer todos os demais metacaracteres.
2.1. Básicos
A partir desse grupo básico, é possível compor expressões regulares para descrever qualquer conjunto de elementos. Os símbolos "*", "+" e "?" não foram comentados ainda, mas é fácil deduzir que são metacaracteres quantificadores especializados. Por outro lado, "." é um tanto diferenciado e representa nada mais, nada menos que qualquer caracterer. Ele é uma espécie de "curinga" das expressões regulares.
Tags: