Есть ли какой-то легкий способ делать замену неким callback-ом? Курение boost::regex_replace результатов не дало :-(
Оказалось не сложно, но все же велосипед. Интересно, есть ли в бусте готовое решение. Код (Text): std::string replacer(boost::smatch const& m) { return /* Собираем замену */; } template <class char_type, class callback> std::basic_string<char_type> regex_replace_callback ( std::basic_string<char_type> const& content, boost::basic_regex<char_type> const& regex, callback cb, boost::match_flag_type flags ) { typedef std::basic_string<char_type> string; typedef typename string::iterator iterator; typedef typename string::const_iterator const_iterator; typedef boost::match_results<const_iterator> match; string result; const_iterator it = content.begin(); do { match m; if(boost::regex_search(it, content.end(), m, regex, flags)) { result.insert(result.end(), it, m[0].first); result += cb(m); it = m[0].second; } else { result.insert(result.end(), it, content.end()); it = content.end(); } } while(it != content.end()); return result; } int main(int argc, char** argv) { std::string content = "Текст для обработки"; boost::regex expr("Регулярное выражение"); std::cout << regex_replace_callback(content, expr, &replacer, boost::match_extra | boost::format_all); return 0; }
n0name Лучше буста еще ничего не придумали. Слишком громкое заявление. Regex вылизан и не менялся уже хрен знает сколько.
Я не про Regex, я его не юзал, не знаю. В других частях буста встречал. Ну да, как сборник различных либ он самый крутой, кто ж спорит.
n0name Ну просто ты сказал что . Я в общем-то и не предлагал падать на колени и молиться ему Факт в том, что это лучшее, из того что есть. По теме - вроде бы такого способа нету, так что велосипеды, велосипеды