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 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
#include
using namespace std;
using namespace boost::xpressive;
int main()
{
std::map rep;
rep["\\alpha"] = "a";
rep["\\beta"] = "b";
rep["\\gamma"] = "g";
rep["\\delta"] = "d";
local 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