2013-04-05 2 views
1

можно использовать Xpressive библиотеки Boost, чтобы сделать некоторые замены регулярных выражений, как это:Использования Boost, C++ библиотеки, чтобы сделать регулярное выражение замены с пользовательской заменой

#include <iostream> 
#include <boost/xpressive/xpressive.hpp> 

void replace(){ 
    std::string in("a(bc) de(fg)"); 
    sregex re = +_w >> '(' >> (s1= +_w) >> ')'; 
    std::string out = regex_replace(in,re,"$1"); 
    std::cout << out << std::endl; 
} 

Что мне нужно, чтобы заменить захваченные частично результат определенной функции преобразования, такой как, например,

std::string modifyString(std::string &in){ 
    std::string out(in); 
    std::reverse(out.begin(),out.end()); 
    return out; 
} 

поэтому результат примера, приведенного выше, будет CB гс.

Как вы думаете, что было бы лучшим подходом к реализации этого?

Заранее благодарен!

ответ

2

Использование

std::string modifyString(const smatch& match){ 
    std::string out(match[1]); 
    std::reverse(out.begin(),out.end()); 
    return out; 
} 

void replace(){ 
    std::string in("a(bc) de(fg)"); 
    sregex re = +_w >> '(' >> (s1= +_w) >> ')'; 
    std::string out = regex_replace(in, re, modifyString); 
    std::cout << out << std::endl; 
} 

live example

В документации есть все о regex_replace функции view Desctiption/Requires

1

Передайте функцию форматтера в regex_replace. Обратите внимание, что необходимо принять const smatch &.

std::string modifyString(smatch const &what){ 
    std::string out(what[1].str()); 
    std::reverse(out.begin(),out.end()); 
    return out; 
} 

std::string out = regex_replace(in,re,modifyString); 

См http://www.boost.org/doc/libs/1_53_0/doc/html/xpressive/user_s_guide.html#boost_xpressive.user_s_guide.string_substitutions