std::regex_iterator
在头文件 <regex> 中定义 |
||
template< class BidirIt, |
(C++11 起) | |
std::regex_iterator
是一个只读迭代器,用于访问底层字符序列中正则表达式的各个匹配项。它满足 LegacyForwardIterator 的要求,但对于可解引用值 a 和 b 且 a == b,*a 和 *b 将不会绑定到同一对象。
在构造时以及每次递增时,它都会调用 std::regex_search 并记住结果(即保存 std::match_results<BidirIt> 值的副本)。可以在构造迭代器时或第一次解引用时读取第一个对象。否则,解引用只返回最近获取的正则表达式匹配的副本。
默认构造的 std::regex_iterator
是序列末尾迭代器。当一个有效的 std::regex_iterator
在到达最后一个匹配项后递增(std::regex_search 返回 false)时,它将变得等于序列末尾迭代器。进一步解引用或递增它会导致未定义行为。
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 << "Found " << std::distance(words_begin, words_end) << " words:\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'; } }
输出
Found 3 words: 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) |
尝试将正则表达式与字符序列的任何部分匹配 (函数模板) |