std:: regex_iterator
|
定义于头文件
<regex>
|
||
|
template
<
class
BidirIt,
|
(C++11 起) | |
std::regex_iterator
是一种只读迭代器,用于访问底层字符序列中正则表达式的各个匹配项。它满足
前向迭代器
的要求,但存在以下例外:对于可解引用的值
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
(private)
|
起始迭代器
( 仅用于说明的成员对象* ) |
BidiIt
end
(private)
|
结束迭代器
( 仅用于说明的成员对象* ) |
const
regex_type
*
pregex
(private)
|
指向正则表达式的指针
( 仅用于说明的成员对象* ) |
regex_constants
::
match_flag_type
flags
(private)
|
标志位
( 仅用于说明的成员对象* ) |
match_results
<
BidiIt
>
match
(private)
|
当前匹配结果
( 仅用于说明的成员对象* ) |
成员函数
构造新的
regex_iterator
(公开成员函数) |
|
|
(destructor)
(implicitly declared)
|
销毁
regex_iterator
,包括缓存值
(公开成员函数) |
|
赋值内容
(公开成员函数) |
|
|
(removed in 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++标准。
| DR | 适用范围 | 发布时的行为 | 正确行为 |
|---|---|---|---|
|
LWG 3698
( P2770R0 ) |
C++20 |
regex_iterator
作为隐匿迭代器时
被定义为
forward_iterator
|
改为
input_iterator
[1]
|
-
↑
iterator_category未因该决议而更改,因为将其更改为 std::input_iterator_tag 可能会破坏过多现有代码。
参见
|
(C++11)
|
标识一个正则表达式匹配,包括所有子表达式匹配
(类模板) |
|
(C++11)
|
尝试将正则表达式与字符序列的任何部分进行匹配
(函数模板) |