1

I can use Xpressive of the Boost library to do some regex replacement like this:

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

What I need is to replace the captured part by the result of a certain transformation function like e.g.

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

so the result of the example provided above would be cb gf.

What do you think would be the best approach to realize this?

Thanks in advance!

2 Answers 2

2

Use

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

In documentation there is all about regex_replace function view Desctiption/Requires

Sign up to request clarification or add additional context in comments.

Comments

2

Pass the formatter function into regex_replace. Note it needs to take 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);

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

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.