std::regex_iterator
| 在标头 <regex> 定义
|
||
template< class BidirIt, class CharT = typename std::iterator_traits<BidirIt>::value_type, class Traits = std::regex_traits<CharT> > class regex_iterator |
(C++11 起) | |
std::regex_iterator 是访问底层字符序列中正则表达式的单独匹配的只读老式向前迭代器 (LegacyForwardIterator) 。它满足老式向前迭代器 (LegacyForwardIterator) 的要求,但对于可解引用的值 a 和 b 且 a == b,*a 和 *b 不会绑定到同一个对象。
在构造和每次自增时,它调用 std::regex_search 并记忆其结果(即保存 std::match_results<BidirIt> 值的副本)。第一个对象可能在构造迭代器或进行首次解引用时读取。其他情况下,解引用只返回最近获得的正则表达式匹配的副本。
默认构造的 std::regex_iterator 是序列尾迭代器。在抵达最后匹配(std::regex_search 返回 false)后自增合法的 std::regex_iterator 时,它变得等于序列尾迭代器。进一步解引用或自增它会引发未定义行为。
典型的 std::regex_iterator 实现保有底层序列的开始和结束迭代器(两个 BidirIt 实例)、指向正则表达式的指针(const regex_type*)、匹配标志(std::regex_constants::match_flag_type)和当前匹配(std::match_results<BidirIt>)。
类型要求
-BidirIt 必须满足老式双向迭代器 (LegacyBidirectionalIterator) 。
|
特化
提供对于常用字符序列类型的数个特化:
在标头
<regex> 定义 | |
| 类型 | 定义 |
std::cregex_iterator
|
std::regex_iterator<const char*>
|
std::wcregex_iterator
|
std::regex_iterator<const wchar_t*>
|
std::sregex_iterator
|
std::regex_iterator<std::string::const_iterator>
|
std::wsregex_iterator
|
std::regex_iterator<std::wstring::const_iterator>
|
成员类型
| 类型 | 定义 |
value_type
|
std::match_results<BidirIt>
|
difference_type
|
std::ptrdiff_t |
pointer
|
const value_type*
|
reference
|
const value_type&
|
iterator_category
|
std::forward_iterator_tag |
iterator_concept (C++20)
|
std::input_iterator_tag |
regex_type
|
std::basic_regex<CharT, Traits>
|
数据成员
| 成员 | 描述 |
BidiIt begin (私有)
|
起始迭代器 (仅用于阐述的成员对象*) |
BidiIt end (私有)
|
尾迭代器 (仅用于阐述的成员对象*) |
const regex_type* pregex (私有)
|
指向一个正则表达式的指针 (仅用于阐述的成员对象*) |
regex_constants::match_flag_type flags (私有)
|
标志 (仅用于阐述的成员对象*) |
match_results<BidiIt> match (私有)
|
当前匹配 (仅用于阐述的成员对象*) |
成员函数
构造新的 regex_iterator (公开成员函数) | |
(析构函数) (隐式声明) |
析构 regex_iterator,包含其缓存的值 (公开成员函数) |
| 赋值内容 (公开成员函数) | |
(C++20 移除) |
比较两个 regex_iterator (公开成员函数) |
| 访问当前匹配 (公开成员函数) | |
| 推进迭代器到下一个匹配 (公开成员函数) |
注解
程序员负责确保传递给迭代器构造函数的 std::basic_regex 对象活得长于迭代器。因为迭代器存储指向正则表达式的指针,所以在销毁正则表达式后自增迭代器会访问悬垂指针。
如果匹配的正则表达式部分只是断言(^、$、\b、\B),那么在迭代器存储的匹配是零长度匹配,即 match[0].first == match[0].second。
示例
#include <iostream>
#include <iterator>
#include <regex>
#include <string>
int main()
{
const std::string s = "Quick brown fox.";
std::regex words_regex("[^\\s]+");
auto words_begin =
std::sregex_iterator(s.begin(), s.end(), words_regex);
auto words_end = std::sregex_iterator();
std::cout << "找到了 " << std::distance(words_begin, words_end) << " 个单词:\n";
for (std::sregex_iterator i = words_begin; i != words_end; ++i)
{
std::smatch match = *i;
std::string match_str = match.str();
std::cout << match_str << '\n';
}
}
输出:
找到了 3 个单词:
Quick
brown
fox.
缺陷报告
下列更改行为的缺陷报告追溯地应用于以前出版的 C++ 标准。
| 缺陷报告 | 应用于 | 出版时的行为 | 正确行为 |
|---|---|---|---|
| LWG 3698 (P2770R0) |
C++20 | regex_iterator 是贮藏迭代器,但它是 forward_iterator
|
使之为 input_iterator[1]
|
- ↑ 解决方案没有修改
iterator_category,因为把它改成 std::input_iterator_tag 会影响到很多现有代码。
参阅
(C++11) |
标识一个正则表达式匹配,包含所有子表达式匹配 (类模板) |
(C++11) |
尝试匹配一个正则表达式到字符序列的任何部分 (函数模板) |