regex 库

这一个库我很难下手,光是正则表达式就有相当长的内容。这里我决定不讨论任何关于正则表达式的内容,完全专注于这人库的使用,所有细节问题也不作讨论。

basic_regex

对于一个正则表达式,一般来说它需要先作预处理,比如说检查语法错误,适当优化等。basic_regex 对象专门处理表达式 然后再提供给匹配、查找和替换操作。basic_regex的主要结构如下

namespace boost {
    template<class charT, class traits=regex_traits<charT>>
     class basic_regex {
        public:
            explicit basic_regex (
                const charT* p,
                flag_type f = regex_constants::normal);    //最常用的构造方法。还有其它。

           bool empty() const;    //如果实例中没有包含有效的正则表达式,返回true

            unsigned mark_count() const;        //返回表达式中,子表达式的个数

            flag_type flags()    const;             //返回一个位掩码,关于配置方面的,如忽略大小写、Perl语法等

            basic_string<charT> str() const;        //返回正则表达式串
    };

   typedef basic_regex<char> regex;        //这两个是我们常用的替代方式
   typedef basic_regex<wchar_t> wregex;
}

通常,对basic_regex的操作仅仅是构造一个对象而已,因为它与basic_string关系紧密,所以在构造里面的string时,种类很多,查阅手册后你就清楚了。

正则表达式和许多简单的模式匹配算法不同,既能寻找全部的匹配,也能产生子表达式的匹配:在模式中通过一双括号(...)界定的每个子表达式。 需要有某种方法来向用户报告子表达式的匹配结果:这是通过定义类match_results(子表达式匹配的有序集合)来实现的,每个子表达式匹配都包含在一个sub_match类型的对象中.

match_result

模板类match_results表示一个表达正则表达式匹配结果的字符序列的集合。 match_results类的对象被传入到算法regex_matchregex_search中,被迭代器regex_iterator返回。 集合的存储空间在需要时由类match_results的成员函数申请和释放。

通常是使用typedef后的下面之一

typedef match_results<const char*>              cmatch;
typedef match_results<const wchar_t*>           wcmatch;
typedef match_results<string::const_iterator>   smatch;
typedef match_results<wstring::const_iterator>  wsmatch

match_results的使用非常需要技巧,不同的子表达式,在不同的时刻,得到的结果可能不一样。具体参考示例。


regex_match 模板函数

我没有列出它的声明,因为重载版本太多了(后面的自由函数情况类似)。如果匹配成功,返回true。注意这里匹配的语义:只有当整个输入字符串匹配正则表达式时,结果才为真;如果只需要匹配子串,请使用regex_search。
很多人在第一次使用时误解了regex_match的意思,准确的讲,正则表达式语言中提到的匹配是对应于regex_search。regex_match可以指定match_results以返回匹配结果。

regex_match 通常用于格式化检查。

regex_search

它在一对双向迭代器指定的范围内搜索给定的正则表达式,存在返回true。同regex_match一样,也可以指定match_results对象保存返回结果。
大家在使用regex_search的目的通常是伴随着获取匹配后的数据,避免不了使用match_results,而且使用输入字符串是迭代器,它要比使用string或指针的重载版本更常见。这样可以通过while循环把所有匹配结果找出来!

regex_replace

替换是三个regex函数中最简单的一个,通常情况下,使用替换的表达式不像搜索那么复杂。


regex 库小结

我草草结束了这一章,原因是我对正则表达式并不熟悉,而且从没有实际用到过。这一章还有两个重要函数没有提到:regex_iterator, regex_token_iterator。


  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值