命名空间
变体
操作

std::regex_iterator

来自 cppreference.cn
< cpp‎ | regex
 
 
 
正则表达式库
(C++11)
算法
迭代器
regex_iterator
(C++11)
异常
特性
常量
(C++11)
正则表达式语法
 
 
在头文件 <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 的要求,但对于可解引用值 aba == 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]
  1. iterator_category 没有因决议而改变,因为将其更改为 std::input_iterator_tag 可能会破坏太多现有代码。

[编辑] 参见

标识一个正则表达式匹配,包括所有子表达式匹配
(类模板) [编辑]
尝试将正则表达式与字符序列的任何部分匹配
(函数模板) [编辑]