要使用Boost.Regex, 你需要包含头文件"boost/regex.hpp". Regex是本书中两个需要独立编译的库之一(另一个是Boost.Signals)。你会很高兴获知如果你已经构建了Boost— —那只需在命令提示符下打一行命令——就可以自动链接了(对于Windows下的编译器),所以你不需要为指出那些库文件要用而费心。
1:对文件regex_token_iterator 分割字符串
迭代器适配器,就是 boost::regex_token_iterator. 它与 regex_iterator 很类似,但却是用于列举不匹配某个正则表达式的每一个字符序列,这对于分割字符串很有用。
boost::regex reg(",");
ifstream ifile("data.ini");
vector<string> vec;
string s;
while (!ifile.eof())
{
ifile>>s; //读取一个整数
//cout<< s <<endl;
//vec.push_back(s); //插入到 vector
cin.get();
}
boost::sregex_token_iterator it(s.begin(),s.end(),reg,-1);
boost::sregex_token_iterator end;
while (it!=end)
vec.push_back(*it++);
使用 regex_iterator. 这个迭代器类型用一个序列来列举正则表达式的所有匹配。
//////regex_iterator
/*boost::regex reg("(\\d+),?");
std::string s="1,2,3,4,5,6";
std::vector<std::string> vec;
boost::sregex_iterator it(s.begin(),s.end(),reg);
boost::sregex_iterator end;
while (it!=end)
{
//vec.push_back(*it++);
//std::cout << *it++ << ' ';
string m = it->str();
//int m = lexical_cast<int>(it->str());
//std::cout << m << ' ';
vec.push_back(m);
++it;
//ui.textEdit->append(QString::number(m));
//for ( int ix = 0; ix < vec.size(); ++ix )
// std::cout << vec[ ix ] << ' ';
}*/
另一个Boost.Regex算法, regex_search. 与 regex_match 不同的是,regex_search 不要求整个输入数据完全匹配,则仅要求部分数据可以匹配。
调用regex_search时引用这些子表达式,这样我们就可以判断是哪一个选择被匹配了。我们使用regex_search的一个重载,它接受一个match_results类型的参数。当 regex_search 执行匹配时,它通过一个match_results类型的对象报告匹配的子表达式。类模板 match_results 使用一个输入序列所用的迭代器类型来参数化。
char *buf = "This is boost::regex example";
boost::regex exampleregex( "boost::regex" );
boost::cmatch what;
while ( boost::regex_search(buf, what, exampleregex))
{
//std::string data = what.str();
//data = what.str();
for (size_t i = 0; i < what.size(); ++i)
{
if (what[i].matched)
std::cout << what[i] << std::endl;
}
std::cout << what.size() << std::endl;
}