Desenvolvimento - C/C++

Usando o Regex do Boost para reconhecer cadeias de caracteres

Expressões Regulares são artifícos usados para reconhecer padrões de cadeias de caracteres em uma String. Com uma Expressão regular é possível filtrarmos informações em um texto como por exemplo o comando "grep" do GNU/Linux.

por Ricardo Souza de Deus



Expressões Regulares são artifícos usados para reconhecer padrões de cadeias de caracteres em uma String.

Com uma Expressão regular é possível filtrarmos informações em um texto como por exemplo o comando “grep” do GNU/Linux.

O Boost um conjunto de lib´s de uso muito comum no mundo C++ oferece uma implementação de “Expressão Regulares” chamado de “Regex”, eu o usei a pouco tempo em um projeto para obter o valor de tags de imagem em um HTML que estava em memória como string, basicamente filtrava as tags “<img src” de um HTML obtendo o nomes das imagens.

No site RegexLib existe vários exemplos de Expressões Regulares que você pode usar com o “Regex” do Boost, eu vou demonstrar em um exemplo bastante simples o uso dessa lib e espero ajudar quem precisa filtrar strings para obter informações.

Com relação a includes do Boost é preciso apenas esse “boost/regex.hpp”.

Partindo do ponto que você ja tem o ambiente configurado, principalmente com relação a “Paths” basta você copiar o código abaixo em um projeto no Visual Studio, no meu caso a versão 2010 e deve funcionar direitinho.

#include <boost/regex.hpp>

void main(void)

{

       //uma string que armazena um pequeno Html com duas tage de imagem

       std::string Html = "<html><body><img src=\"imagem-1.GIF\">

<img c=\"imagem-2.GIF\"></body></html>";

       //expression: armazena a expressão regular que vai ser usado no match

       boost::regex expression("<img([^>]*[^/])>");

      

       //esses iterator são usados na busca por match

    std::string::const_iterator start, end;

       //pega o começo da string

    start = Html.begin();

       //pega o final da string

    end = Html.end();

       //mais itertors ;) esse armazena os matchs

    boost::match_results<std::string::const_iterator> what_;

       //indica que vai ser usado o tipo de match default

    boost::match_flag_type flags = boost::match_default;

       //faz um while que fica enquanto é possivel realizar match

    while( boost::regex_search(start, end, what_, expression,flags ) )

    {

             //cria uma string com os iterators

             std::string img( what_[0].first, what_[0].second );

             //imprimi a cadeia de caracteres que foi feito match

             std::cout<<img<<std::endl;

             //remove para nao reconsiderar a string

             what_[5].first - Html.begin();

             //atualiza o iterator

             start = what_[0].second;

             //realiza update nas flags

             flags |= boost::match_prev_avail;

             flags |= boost::match_not_bob;

    }

}

Saida gerada:

<img src="imagem-1.GIF">

<img src="imagem-2.GIF">

Espero ter ajudado quem precisa realizar algum “parser” seja de html como no meu caso ou então realizar “finds” em um arquivo texto ou em strings, caso você não consiga compilar,  envie um email que eu dou um help.

Grande abraço,

Ricardo Souza de Deus.

Analista de Sistemas.

Ricardo Souza de Deus

Ricardo Souza de Deus