Regular expressions, usando a libc

Já ouvi a alegação de que C e C++ não prestam porque, por exemplo, não implementam regular expressions como Javascript ou Perl fazem. Nada poderia estar mais errado… O GCC implementa, na biblioteca padrão de C (libc), um conjunto de funções listadas no header regex.h. E, melhor ainda, implementa a versão POSIX das regular expressions (o mesmo nao pode ser dito de PERL, por exemplo).

Eis um exemplo simples:

#include <stdio.h>
#include <regex.h>

int main(void)
{
  int i, r;
  regex_t reg;
  char* argv[] = { "Moo", "foo", "OlOlo", "bar", "ZaooZA~!" };

  /* Cria e compila uma regular expression que
     sem subexpressões e usando regex posix extendido. */
  if (r = regcomp(&reg, "\\b[A-Z]\\w*\\b", REG_NOSUB | REG_EXTENDED))
  {
    /* Trata erro e sai */
    char errbuf[1024];

    regerror(r, &reg, errbuf, sizeof(errbuf));
    printf("error: %s\n", errbuf);

    return 1;
  }

  /* Testa cada string de 'argv' contra a regex */
  for (i = 0; i < sizeof(argv) / sizeof(char*); i++)
  {
    if (regexec(&reg, argv[i], 0, NULL, 0) == 0)
      printf("matched: %s\n", argv[i]);
  }

  regfree(&reg);

  return 0;
}

Se você tem acompanhado as notícias, já deve ter reparado que a especificação C++1x já foi disponibilizada pela ISO, só que o GCC ainda não implementou, direito, a classe regex. Pelo menos eu não consegui compilar um exemplo usando essa classe.

O uso das funções de regex.h é bem simples, como pode ser visto acima e na manpage. regcomp “compila” uma regular expression e aplica alguns flags a ela. regexec faz a comparação da expressão contra uma string. O 3º e 4º parâmetros são usados para obter informações sobre o teste e o último parâmetro são flags que modificam a semântica da expressão. No exemplo acima não restringimos a comparação porque não usamos nenhum flag em regexec. Na chamada a regcomp o flag REG_NOSUB não é realmente necessário, já que não usamos subexpressões, mas o flag REG_EXTENDED é necessário pelo uso de \b e \w (veja o wiki sobre regex POSIX).

O código acima deve listar:

matched: Moo
matched: OlOlo
matched: ZaooZA~!

OBS: Ahhh… Nem adianta usar o compilador C++ da Microsoft. Por lá não tem regular expressions, a não ser que vocẽ esteja usando uma classe do .NET.

Anúncios

Deixe um comentário

Faça o login usando um destes métodos para comentar:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s