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

Я могу использовать Xpressive библиотеки Boost, чтобы выполнить некоторую замену регулярного выражения следующим образом:

#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 gf.

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

Заранее спасибо!

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;
}

живой пример

В документации есть все о regex_replace представление функции Описание / Требуется

Передайте функцию форматирования в 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

Другие вопросы по тегам