使用Boost C ++库进行正则表达式替换自定义替换

时间:2013-04-05 10:47:44

标签: c++ boost boost-regex boost-xpressive

我可以使用Boost库的Xpressive来做一些像这样的正则表达式替换:

#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 个答案:

答案 0 :(得分: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 :(得分:2)

将格式化程序功能传递给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