Informática Numaboa - Tutoriais e Programação
REGEX - Introdução
Sex 17 Ago 2007 17:37 |
- Detalhes
- Categoria: REGEX - Expressões Regulares
- Atualização: Terça, 21 Abril 2009 20:28
- Autor: vovó Vicki
- Acessos: 9250
Uma expressão regular é um padrão que caracteriza uma certa porção de texto. Por exemplo, uma é uma expressão regular perfeitamente válida que caracteriza uma porção do texto "Aldeia Numaboa" ou uma porção de um texto onde haja uma referência à atriz "Luma de Oliveira".
O nome "expressão regular" vem de uma teoria matemática na qual este princípio de caracterização se baseia. Já sei. Falou em matemática, todo mundo se arrepia, mas não se preocupe: as expressões regulares já são um "enrosco" só e a teoria matemática só iria piorar ainda mais as coisas. Pode ficar tranquilo, a matemática ficará de fora
Quem usa (ou deveria usar) expressões regulares?
Todos os programadores que usam linguagens com suporte a expressões regulares, ou seja, que possuam "motores" de expressões regulares deveriam conhecer as ditas cujas. As linguagens mais conhecidas que possuem motores regex são Perl, PHP, Python, .NET e a plataforma Java. Infelizmente (e para variar) não existe um padrão estabelecido, o que significa que o modo de chamar uma regex varia de acordo com o ambiente de programação. No conjunto destes tutoriais vou usar a sintaxe da biblioteca PCRE. PCRE vem de Perl Compatible Regular Expressions e é uma biblioteca de código aberto escrita em C por Phillip Hazel. Este é, de longe, o melhor conjunto de expressões regulares disponível no momento.
Para que servem as expressões regulares?
Quando comecei a me interessar por este assunto, minha primeira dificuldade foi entender porque este troço foi inventado. Depois de ler uma porção de explicações, algumas extremamente complicadas, outras um bocado herméticas e outras ainda um tanto infantis, finalmente caiu a ficha:
Expressões Regulares servem para procurar e comparar CARACTERES.
Pode parecer bobagem, mas as regex servem exatamente e tão somente para isto - possibilitam localizar CARACTERES e nada mais! Podem ser caracteres isolados ou uma porção deles dispostos numa determinada ordem, mas sempre caracteres (não é à toa que usei o negrito duas vezes). Os caracteres costumam ser chamados de letras, o que não é errado. Acontece que as letras não são os únicos caracteres que existem. Por exemplo, se eu colocar num texto qualquer que "uma dúzia é igual a 12", o número 12 é composto por dois algarismos que também são caracteres válidos porque, assim como as letras, são símbolos que expressam uma idéia e que compõem o texto - não estão sendo usados como valor de uma variável ou para realizar um cálculo matemático.
Resumindo a história: se eu quiser procurar um valor com uma regex, vou quebrar a cara, mas, se quiser procurar como se escreve 12 usando algarismos como caracteres... tudo bem (e dá-lhe negrito!)
Acontece que os textos possuem mais do que apenas letras e algarismos. As palavras são separadas por espaços, as sentanças são separadas por vírgulas e as frases são separadas por pontos. Além disto existem hífens, ponto e vírgula, sublinhado, etc e tal. Tudo isto são convenções estabelecidas (mas nem sempre obedecidas :blush: ) para compor textos e adivinhe só? Também são considerados caracteres!
Que vantagem Maria leva?
Os programadores de platão que não usam expressões regulares já devem estar se perguntando: e daí, uso uma linguagem de programação que possui um caminhão de funções que lidam com strings. São fáceis de entender, fáceis de aplicar e o resultado é exatamente o que preciso. E eu com as tais de expressões regulares?
Pra mim isto não é nenhuma novidade. Antes de conhecer os monstrinhos regex, também pensava do mesmo modo até descobrir o seguinte: as funções simples de strings e as expressões regulares fazem a mesma coisa, com um pequeno detalhe. Usar as funções convencionais que lidam com strings dá um trabalho do cão, incha o código, dificulta a depuração e a manutenção e penaliza o interpretador do código. Por outro lado, o motor regex foi projetado para fazer exclusivamente o trabalho de procura e localização, foi otimizado para dar rendimento máximo e, na maioria das vezes, precisa apenas UMA LINHA de instrução. Ah! Aí a coisa pegou pro meu lado e fiquei toda animada!
Já que este texto introdutório virou meu muro de lamentações, agora vem a parte dolorosa: o grande problema (que acabei descobrindo não ser só meu) é "explicar" o que pretendemos para o motor regex. O bacaninha "fala" uma língua estranha pra caramba e, mais do que isto, não podemos "conversar" com ele diretamente. Agora me conte uma coisa: depois desta introdução, você está querendo desistir? Eu não desisti, e me dei bem porque resolvi APRENDER FAZENDO! Talvez isto sirva de estímulo, ou talvez o pequeno exemplo a seguir dê uma noção do que você também pode aprender pondo a mão na massa.
Um exemplo do que você pode conseguir
Imagine o seguinte cenário: temos um texto de alguns megabytes e queremos encontrar um endereço de e-mail referido em algum ponto do dito cujo. Podemos ler o texto até encontrá-lo - o que, além de chato, dá um baita de um trabalho - ou submeter o megatexto a uma expressãozinha regex do tipo
\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b
Fácil, não é mesmo? Bem, é fácil se conseguirmos entender esta sopa de letrinhas e como se monta uma regex deste tipo. Volto a dizer: quando esbarrei nas regex pela primeira vez achei que era coisa de maluco e que este tal de motor era uma insanidade. Com o tempo, e depois de bater muito a cabeça, comecei a gostar deste monstrinho e hoje não consigo viver sem ele :love:
Por exemplo, a regex para a checagem de um endereço de email fica assim (ponha o cursor do mouse numa parte da regex ou numa das linhas de explicação):
\b[A-Z0-9._%-]++@[A-Z0-9._%-]+\.[A-Z]{2,4}\b
- Declarar posição no limite da palavra
- Combinar um único caractere da lista: um dos caracteres "._%-", ou entre A e Z ou entre 0 e 9
- De uma a ilimitadas vezes, tantas vezes quanto possível, sem desistir (possessivo)
- Combinar o caractere "@" literalmente
- Combinar um único caractere da lista: um dos caracteres "._%-", ou entre A e Z ou entre 0 e 9
- De uma a ilimitadas vezes, tantas vezes quanto possível, desistindo se necessário (guloso)
- Combinar o caractere "." literalmente
- Combinar um único caractere entre A e Z
- De 2 a 4 vezes, tantas vezes quanto possível, desistindo se necessário (guloso)
- Declarar posição no limite da palavra
Tem mais pessoal. Veja os outros tutoriais com exemplos práticos.