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