Boost logo

Boost Users :

Subject: Re: [Boost-users] best tool in Boost for (massive) string replacement?
From: Eric Niebler (eric_at_[hidden])
Date: 2010-09-25 21:04:56

On 9/23/2010 6:11 PM, alfC wrote:
> With all the tools available in Boost and coming from a different
> backgroup is hard for me to choose what is the best tool in Boost to
> do a massive string replacement.
> The problem I have is the following, I have a map of replaced and
> replacing strings
> std::map<string,string> rep;
> rep["\\alpha"] = "a";
> rep["\\beta"] = "b";
> ...
> let's say about 100 of these. And I have an input/output file (few
> thousand lines) were I would like to do all this replacements. What is
> the best tool in boost to do this,
> Spirit, Regex, tokenizer, StringAlgorithm?

None of the above. Use Boost.Xpressive. The complete solution is below:

    #include <map>
    #include <string>
    #include <iostream>
    #include <boost/xpressive/xpressive_static.hpp>
    #include <boost/xpressive/regex_actions.hpp>

    using namespace std;
    using namespace boost::xpressive;

    int main()
        std::map<std::string, std::string> rep;
        rep["\\alpha"] = "a";
        rep["\\beta"] = "b";
        rep["\\gamma"] = "g";
        rep["\\delta"] = "d";

        local<std::string const *> pstr;
        sregex const rx = (a1 = rep)[pstr = &a1];

        std::string str("\\alpha \\beta \\gamma \\delta");
        std::cout << regex_replace(str, rx, *pstr) << std::endl;

The regex (a1 = rep) takes the keys in the rep map and builds a search
trie ( out of them. When the trie
matches, the attribute a1 receives the value associated with the
matching key. The semantic action [pstr = &a1] assigns the address of
the value to the local variable pstr.

The call to regex_replace uses the lambda expression *pstr as the


Eric Niebler
BoostPro Computing

Boost-users list run by williamkempf at, kalb at, bjorn.karlsson at, gregod at, wekempf at