boost正则表达式小结

6 篇文章 0 订阅

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);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值