
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