boost正则表达式支持多种类型的正则流派,包括perl javascript gnu等等,使用时需要包含头文件。
#include <boost/regex.hpp>
-正则表达式类:
namespace boost{
template <class charT, class traits = regex_traits<charT> >
class basic_regex;
typedef basic_regex<char> regex;
typedef basic_regex<wchar_t> wregex;
}
[boost::basic_regex](http://www.boost.org/doc/libs/1_39_0/libs/regex/doc/html/boost_regex/ref/basic_regex.html%20%5Bwww.boost.org%5D)
可以看到 basic_regex有两个特化版本,一个用于ascii字符(boost::regex),一个用于宽字符(boost::regex)。
regex的构造方式:
- 使用const char*作为参数
boost::regex pat("^abc$");
//或者
const char* p = "$abc$";
boost::regex pat(p);
//或者const char*后面跟一个数字表示长度
boost::regex pat(p,3);
- 使用std::string作为参数
std::string str("^abc$");
boost::regex pat(str);
- 使用迭代器表示的range作为参数
std::string str("$abc$");
boost::regex pat(str.begin(),str.end());
- sub_match
在正则表达式中用小括号可以分组,所有匹配的分组就是一个sub_match,sub_match是一个模板类,继承自std::pair<BiIter,BiIter>
它的first和second成员构成的range就是匹配的分组。sub_match中有个public的成员变量matched表示是否匹配。
一般不直接使用sub_match,因为sub_match包含在下面说到的match_result模板类中。
另外sub_match中重载了operator std::basic_string<value_type>()
所以可以直接把sub_match当作std::basic_string使用(分别是std::string或者std::wasting). - match_results
match_results有四个特化:
typedef match_results<const char*> cmatch;
typedef match_results<const wchar_t*> wcmatch;
typedef match_results<std::string::const_iterator> smatch;
typedef match_results<std::wasting::const_iterator> wsmatch;
//match_results中实际上保存有一个sub_match的vector
//vector中的每个元素表示一个匹配的字符串range
//所以这四个特化版本中的模板参数实际上是传给match_results中
//的vector,vector传给sub_match,sub_match传给std::pair
另外match_results还有两个函数比较有用,prefix()和suffix()都返回的是sub_match类型,用来表示字符串中匹配之前的部分和匹配之后的部分。
-正则表达式函数 - boost::regex_match:完全匹配函数
//第一个参数可以替换成range(也就是一对iterator)
//第二个参数match_results可以省略
bool boost::regex_match(string,match_results,regex);
bool boost::regex_match(string,regex);
boost::regex_search:搜索函数
//第一个参数可以替换成range(也就是一对iterator),用于在循环中, //每次改变第一个iterator来搜索剩下的部分 //第二个参数match_results可以省略 bool boost::regex_search(string,match_results,regex); bool boost::regex_search(string,regex);
搜索函数每次只搜索一个匹配出来,这时候需要循环调用函数来把所有的匹配部分都搜索出来,就需要使用动态改变的iterator range来实现了:
std::string regstr = "\\d+"; boost::regex pat(regstr); std::string line = "12;34;56;78"; boost::smatch result; std::vector<int> v; std::string::const_iterator begin = line.begin(); std::string::const_iterator end = line.end(); while(boost::regex_search(begin,end,result,pat)){ v.push_back(boost::lexical_cast<int>(result[0])); begin = result.suffix().first; }
- boost::replace:替换函数
template <class OutputIterator, class BidirectionalIterator, class traits, class charT>
OutputIterator regex_replace(OutputIterator out,
BidirectionalIterator first,
BidirectionalIterator last,
const basic_regex<charT, traits>& e,
const basic_string<charT>& fmt,
match_flag_type flags = match_default);
template <class traits, class charT>
basic_string<charT> regex_replace(const basic_string<charT>& s,
const basic_regex<charT, traits>& e,
const basic_string<charT>& fmt,
match_flag_type flags = match_default);