类模板regex_token_iterator是一个迭代器适配器,即它代表一个现存的迭代器序列。对于每次匹配的结果,类模板会枚举序列中的所有正则表达式,并展示所有的一个或多个子表达式。迭代器枚举的每个位置是一个sub_match类模板实例,该实例表明一个特定的子表达式是如何和正则表达式匹配的。
当类regex_token_iterator用于枚举一个单一的子表达式时,该迭代器执行字段分割——枚举每个不符合正则规则的子表达式,即和正则表达式不匹配的字段。
迭代器一旦被构造,将找到并存储一个regexiterator<BidirectionalIterator>位置的值,并设置内部计数器N为0。并且它也维护一个序列subs,该序列中包含子表达式的清单,以备枚举之需。每次执行operator ++之后,计数器N会增加。如果N超过或者等于子表达式个数,迭代器增加器的成员position和计数器N会被设置为0。
如果到达了序列的末尾,迭代器变成等于序列尾端迭代器的值。除被枚举的非子表达式具有下标index-1,迭代器会枚举最后一个子表达式,其中包含所有(最后一个匹配的子表达式尾端,至被枚举的输入序列尾端)字符,并且不会是空的子表达式。
默认构造器构造一个序列末端的迭代器对象,这是仅有的合法迭代器,用于尾端位置。当operator∗应用于序列的一端时,其返回结果是不确定的。任意其他的迭代器值是一个sub_match<BidirectionalIterator>类型的常量值。序列端迭代器使用operator- >时,其结果也是不确定的。对于任意迭代器的值,其返回结果是一个sub_match<BidirectionalIterator>∗的值。
不能存储内容至regex_token_iterator类型迭代器中。两个末端迭代器总是相等的。一个序列末端迭代器是不能和非末端迭代器相等的。对于两个序列末端迭代器,如果是使用相同的参数构造而来的,那么这两个末端迭代器是可以相等的。
后缀迭代器是一个regex_token_iterator类型对象,该迭代器指向字符序列的末端。在后缀迭代器中,成员result保持一个指向数据suffix的指针,成员suffix.match的值是true,suf-fix.first指向最后序列的起始端,suffix.second指向最后序列的末端。
如果subs[N]==-1,或者(∗position)[subs[N]],或任意subs[N]的其他数值,与其相匹配的是(∗position).prefix()。
正则迭代器有助于迭代匹配的子序列,然而有时也会处理匹配的子表达式之间的所有内容。若想使一个特征字符串成为分段的标识(被某些东西隔断),则可以将其作为特定一个正则表达式。类regex_token_iterator< >具有通常的实例,可用于字符串和字符序列。
再者,为了初始化迭代器的对象,可以传递给迭代器的参数包括序列的起始端、序列的末端和一个正则表达式。另外,还可以将标识化的元素赋予整型值:-1意味着匹配的表达式之间的所有子序列;0意味着所有匹配的正则表达式;其他数值意味着在正则表达式中相匹配的第n个子表达式。
该类的声明形式如下:
由上述可知,类模板中包含5个构造函数。第1个构造函数是无参数的;其余4个均包含相应的参数。
(www.xing528.com)
其作用是构造一个序列末端的迭代器,并且会初始化向量组成员subs,保存单个的sub-match类型对象。其余的构造函数作用各不相同,均有轻微的差别。每个构造器均设置内部计数器N为0。若position不是序列末端迭代器,则构造器设置result为当前匹配的地址。若subs中储存的任意数值为-1,构造器设置∗this指针为一个后缀迭代器;否则,构造器设置∗this指针为序列末端迭代器。
该迭代器模板的使用方法参见例17-11和例17-12。
例17-11
例17-11的执行效果如图17-9所示。
图17-9 例17-11的执行效果
例17-12
例17-12的执行效果如图17-10所示。
图17-10 例17-12的执行效果
注:sregex_token_iterator和cregex_token_iterator是regex_token_iterator的实例化类,可供程序员直接使用。
免责声明:以上内容源自网络,版权归原作者所有,如有侵犯您的原创版权请告知,我们将尽快删除相关内容。