Learning boost 6

Regex 1

概述

模板类:

l         basic_regex          用来保存一个“正则表达式”的类。

l         sub_match            继承于pair<Iterator,Iterator>迭代器组,用来表示匹配的一个结果。

l         match_results             sub_match的容器,用来表示一次搜索或匹配算法的所有结果,类似于vector<sub_match>

算法:

l         regex_math   匹配算法,测试一个字符串是否和一个正则式匹配,并通过match_results返回结果。

l         regex_find     查找算法,查找字符串的一个和正则式匹配的字串,并通过match_results返回结果。

l         regex_format       替换算法,查找字符串中的所有匹配正则式的字串,并使用“格式化字符”串替换。

迭代器:

l         regex_iterator      枚举一个字符串中所有匹配的字串,regex_iterator的结果相当于match_results

l         regex_token_iterator 枚举一个字符串中所有匹配的字串,regex_iterator的结果相当于sub_match

 

详述

l       basic_regex

template <class charT, class traits = regex_traits<charT>, class Allocator = std::allocator<charT>  >

class basic_regex;

typedef basic_regex<char> regex;

typedef basic_regex<wchar_t> wregex;

很明显,charT是正则式的字符类型,regexwregexbasic_regex的两个特化。

注意,正则式的字符类型要和需要匹配的字符串的字符类型相同。例如:不能在regex_find算法中分别使用stringwregex最为参数,要么是stringregex,要么是wstringwregex

构造函数:

basic_regex re

产生空的正则式

basic_regex re(str)

正则式为strstr可以为basic_string,也可以是0结尾的char*字符串。

Basic_regex re(re2)

拷贝构造。

basic_regex re(str,flag)

正则式为str,使用flag语法选项,flag是一组常量的组合。例如:icase可以使正则式匹配忽略大小写。

basic_regex re(beg,end)

使用迭代器构造正则式。可以是basic_string的迭代器,也可以是const char*

basic_regex re(beg,end,flag)

使用迭代器构造正则式,flag是语法选项。

常用的语法选项:

regex_constants::normal

默认的语法。符合EMCAScript,JavaScript中的正则式。

regex_constants::icase

匹配的时候忽略大小写。

regex_constants::nosubs

不把匹配的子串保存进match_results结构。

regex_constants::collate

对于[a-b]的匹配,考虑地区

 

语法选项通过或运算来结合。在basic_regex中这些语法选项也进行了定义,所以可以写成regex::normal,这要比regex_constants少打好几个字母了吧!J

assign成员函数:

re.assign(re2)

复制一个正则式

re.assign(str)

正则式为str

re.assign(str, flag)

正则式为str,使用flag语法选项,flag是一组常量的组合。

re.assign(beg, end)

使用迭代器构造正则式。

re.assign(beg, end, flag)

使用迭代器构造正则式,flag是语法选项。

 

其实basic_regex很多用法和basic_string很像,因为正则表达式也是个字符串嘛!

迭代器:

regex::iterator it

常迭代器类型,即const_iterator

re.begin()

返回的是常迭代器哦!const_iterator

re.end()

没有逆向迭代器。

例如:copy(re.begin(), re.end(), ostream_iterator<char>(cout));

其他:

re.size()

正则表达式长度,即str的长度。

re.max_size()

正则表达式的最大长度。

re.empty()

长度是否为0

re.mark_count()

返回正则式的组数,一般情况下为小括号对数+1。在boost.regex中使用小括号分组,详情请看下面的算法详解。

re.flags()

返回语法选项。

cout<<re

正则式的流输出,相当于上面示例的copy算法。

swap

成员函数,全局函数都有

re.imbue(loc)

设置localloc,返回原来的local

re.getloc()

得到当前local

==,!=,<,<=,>,>=

比较运算符重载

 

l       sub_match

sub_match是一个迭代器组,表示正则式中的一个匹配。

template <class BidirectionalIterator>

class sub_match : public std::pair<BidirectionalIterator, BidirectionalIterator>;

boost没有提供sub_match的任何特化,因为我们不会显示的声明一个sub_match变量。sub_match是作为match_results的元素用的。比如:match_resultsoperator[]和迭代器返回的就是一个特化的sub_match

唯一的成员变量:

bool matched  是否匹配。

成员函数:

length()

返回长度,即两个迭代器之间的距离。

operator basic_string< value_type>()

隐式的basic_string转换。

str()

显式的basic_string转换。

还有就是一大堆的比较操作符的重载了,这里就不多说了。

 

l       match_results

match_results相当于sub_match的容器,用于表示正则式算法的返回结果。

template <class BidirectionalIterator,

          class Allocator = allocator<sub_match<BidirectionalIterator> >

class match_results;

 

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;

声明很简单,有四个特化可以直接使用,不过要注意stringchar*字符串使用的match_results是不同的。

成员函数:

m.size()

容量。

m.max_size()

最大容量。

m.empty()

容量是否为0

m[n]

n个元素,即sub_match

m.prefix()

返回代表前缀的sub_match,前缀指字符串的开头到第一个匹配的开头。

m.suffix()

返回代表后缀的sub_match,后缀之最后一个匹配的结尾到字符串的结尾。

m.length(n)

返回第n个元素的长度,即m[n].size()

m.position(n)

返回第n个元素的位置。

cout<<m

流输出,输出整个匹配,相当于cout<<m[0]。因为第0个元素是整个匹配,详细情况请看下面的解释。

m.format(fmtstr)

使用格式化字符串,格式化结果,返回字符串

m.format(fmtstr,flags)

使用格式化字符串,格式化结果,返回字符串,flags是格式化选项。

m.format(out,fmtstr)

同上,但是使用输出迭代器输出结果。

m.format(out.fmtstr,flags)

同上,但是使用输出迭代器输出结果。

迭代器:

smatch::iterator

迭代器,常迭代器

smatch::const_iterator

同上

m.begin()

返回常迭代器

m.end()

同上

 

(待续,下回说算法了)

Logo

权威|前沿|技术|干货|国内首个API全生命周期开发者社区

更多推荐