Namespaces
Variants

std:: regex_iterator

From cppreference.net
Regular expressions library
Classes
(C++11)
Algorithms
Iterators
regex_iterator
(C++11)
Exceptions
Traits
Constants
(C++11)
Regex Grammar
定义于头文件 <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 是一种只读迭代器,用于访问底层字符序列中正则表达式的各个匹配项。它满足 前向迭代器 的要求,但存在以下例外:对于可解引用的值 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]
  1. iterator_category 未因该决议而更改,因为将其更改为 std::input_iterator_tag 可能会破坏过多现有代码。

参见

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