2012/03/17

Ajuda nas Regular Expressions (RegEx)


Se no outro dia vos dei a conhecer uma ferramenta que frequentemente é necessária para quem programa (o QuickDiff) hoje trago-vos outras que abordam uma das áreas que maiores dores de cabeça causa aos programadores: as Regular Expressions, também carinhosamente conhecidas por RegEx.

Inevitavelmente, a maioria dos programas ou sistemas precisa de dados que possa processar... e em muitos casos esses dados vêm de algo introduzido pelo utilizador (tal como qualquer formulário de registo num site web que vos pergunta nome, morada, email, telefone, etc.)

E é na validação e no processamento desses dados em formato de texto que as coisas começam a poder complicar-se...

Por exemplo, como poderão saber se o email que o utilizador introduzir é mesmo um email sintaticamente correcto, para evitar que alguém introduza algo como "xpto" ou "xxx@a.b"?
Torna-se necessário inspeccionar o texto introduzido, e é aí que entram as regular expressions.

As regular expressions permitem identificar padrões de texto à vontade do programador, e têm um potencial que... é difícil de de imaginar (e muitas vezes de atingir :).

Poderão por exemplo definir uma expressão que quando aplicada a um texto vos permita isolar números telefónicos; ou endereços de email; ou coisas mais artísticas como: todas as palavras começadas por "a", que contenham também um "r" e que sejam precedidas por outra palavras que acabe em "s" e não tenha mais que um espaço entre elas. (ufa!)


Infelizmente... estas expressões tornam-se também bastante crípticas... e em autênticas "obras de arte" assim que se começam a complicar...

Por exemplo, uma regex que permita identificar endereços IP poderá ser definida como:
  • \b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\b

Isto identificará quatro blocos de 1 a 3 digitos separados por ".", tal como 127.0.0.1 e 192.12.107.123.

Mas... identificará igualmente números como 500.500.500.500 ou 999.999.999.999 que são endereços IP inválidos (o valor máximo para cada elemento do endereço IP é de 255).

... Será que as regex podem dar uma ajuda?...

Podem sim... só que aquela expressão anterior passaria então a ser algo como isto:
  • \b(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\b

Algo que já trataria de aceitar apenas endereços IPs válidos... (E acreditem que isto ainda apenas um exemplo básico do que é possível fazer-se com regex!)

Para vos ajudar a poupar algumas dores de cabeça, hoje trago-vos alguns sites que poderão ser úteis quando se depararem com a tal tarefa de terem que criar uma regex:
E fica ainda a sugestão de um online book sobre RegEx, deixada pelo Carlos Afonso nos comentários.

Divirtam-se. :)

3 comentários:

  1. Acho que podias acrescentar o learn regex the hard way http://regex.learncodethehardway.org/book/ (on-line book)

    ResponderEliminar
  2. Um que costumo usar para construir e testar é este: http://gskinner.com/RegExr/
    que também tem uma versão offline para usar em standlone.

    ResponderEliminar