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 DeusExpressõ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.