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 は、基となる文字シーケンス内の正規表現の個々のマッチにアクセスする読み取り専用イテレータです。これは 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 の典型的な実装は、基になるシーケンスの先頭イテレータと終端イテレータ(2つの 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 を構築する
(public member function)
(destructor)
(implicitly declared)
regex_iterator を破棄する(キャッシュされた値を含む)
(public member function)
内容を代入する
(public member function)
(removed in C++20)
2つの regex_iterator を比較する
(public member function)
現在のマッチにアクセスする
(public member function)
イテレータを次のマッチに進める
(public member function)

注記

イテレータのコンストラクタに渡された 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 に変更すると、既存のコードの多くが破壊される可能性があるためです。

関連項目

正規表現のマッチ、およびすべての部分式のマッチを識別する
(クラステンプレート)
文字シーケンスの任意の部分に正規表現のマッチを試みる
(関数テンプレート)