|
Boost Users : |
From: llwaeva_at_[hidden]
Date: 2006-07-30 05:24:05
Hi there,
boost:regex is powerful in string replacing. I am working with a
complicate case which need a faster method in replacing substring. Here
is my problem.
I have a big string contains some pattern %K{xxx}, where xxx is a
filename which may vary from place to place. e.g.
BIG_STRING =
...
...
%K{abc.txt}
...
...
...
...
%K{foo.ini}
...
...
OK, what complicated is that: I must retrieve the filename from %K{xxx}, load
the content of the file and then replace %K{xxx} with the content. I
search the code with a loop
string::const_iterator start, end;
string filename, content;
boost::regex re("%K\\{(.*)\\}");
boost::match_results<std::string::const_iterator> what;
boost::match_flag_type flags = boost::match_default;
start = BIG_STRING.begin();
end = BIG_STRING.end();
while ( regex_search(start, end, what, re, flags) )
{
if (what[1].first!=what[1].second)
{
filename = string(what[1].first, what[1].second);
}
content = LoadFile(filename);
// transform the const_iterator to iterator
string::iterator sbegin(BIG_STRING.begin()), send(BIG_STRING.begin());
std::advance(sbegin, distance<string::const_iterator>(sbegin, what[0].first));
std::advance(send, distance<string::const_iterator>(send, what[0].second));
// replace the content
BIG_STRING.replace( sbegin, send, content );
// reset the current position of the source string to search the next pattern
start = what[1].second;
// I copy the code from the document of boost, don't know what the following code for
flags |= boost::match_prev_avail;
flags |= boost::match_not_bob;
}
The second approach is to retrieve the filename and load the content seperately, build the
substitute format and replace all the patterns with replace_all_regex, e.g.
string& escape_format( string& input )
{
replace_all( input, "$", "$$" );
replace_all( input, "\\", "\\\\" );
replace_all( input, ":", "\\:" );
replace_all( input, "?", "\\?" );
replace_all( input, "(", "\\(" );
replace_all( input, ")", "\\)" );
return input;
}
stringstream reformat;
string regex_text;
int n=0;
while ( regex_search(start, end, what, re, flags) )
{
if (what[1].first!=what[1].second)
{
filename = string(what[1].first, what[1].second);
}
content = LoadFile(filename);
regex_text += string(what[0].first, what[0].second);
reformat << "(?" << ++n << " " << escape_format( content ) << ")";
// reset the current position of the source string to search the next pattern
start = what[1].second;
// I copy the code from the document of boost, don't know what the following code for
flags |= boost::match_prev_avail;
flags |= boost::match_not_bob;
}
// replace the whole string at last
replace_all_regex( BIG_STRING, boost::regex(regex_text), reformat.str(), format_all );
But this approach cause exception!!!
Any better idea for my problem?
Thanks in advance.
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