boost::regex_replace的使用
boost::regex_replace的使用
boost::regex_replace是一个用于替换字符串内容的接口,boost官方链接在这里,最近用到这个接口的场景比较多,在此记录下这两种构造函数的使用方式
第一种方式
template <class traits, class Formatter>
basic_string<charT> regex_replace(const basic_string<charT>& s,const basic_regex<charT, traits>& e,Formatter fmt,match_flag_type flags = match_default);
这种方式比较好理解,传入的参数是待替换的字符串,匹配的正则pattern,以及替换的格式,例如:
string s1 = "0 0 10000 10000"
boost::regex pattern("-?\\d+ -?\\d+");
string resline = boost::regex_replace(s1, pattern, "( $& )");
cout<<resline<<endl; // 输出结果为 ( 0 0 ) ( 10000 10000)
这种方式的输出结果是字符串
第二种方式
输出结果是一个迭代器
template <class OutputIterator, class BidirectionalIterator, class traits, class Formatter>
OutputIterator regex_replace(OutputIterator out,BidirectionalIterator first,BidirectionalIterator last,const basic_regex<charT, traits>& e,Formatter fmt,match_flag_type flags = match_default);
使用示例如下所示:
string s1 = "0 0 10000 10000"
boost::regex pattern("-?\\d+ -?\\d+");
string resline = boost::regex_replace(line, pattern, "( $& )");boost::regex pattern(" -?\\d+ -?\\d+");
std::ostringstream t(std::ios::out | std::ios::binary);
std::ostream_iterator<char, char> oi(t);
boost::regex_replace(oi, line.begin(), line.end(), pattern, " ( $& )");
cout<<t.str()<<endl; // 输出结果为 ( 0 0 ) ( 10000 10000)
这种方式可能会比较麻烦一些,它的特点是输出结果是迭代器,如果是一个vector,这种就可以一个接口就替换完了,不用使用循环去做。