|
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 (http://en.wikipedia.org/wiki/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
replacement.
HTH,
-- Eric Niebler BoostPro Computing http://www.boostpro.com
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net