Namespaces
Variants

std:: regex_token_iterator

From ja.cppreference.net
Regular expressions library
Classes
(C++11)
Algorithms
Iterators
regex_token_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_token_iterator
(C++11以降)

std::regex_token_iterator は読み取り専用の LegacyForwardIterator であり、基となる文字シーケンス内の正規表現の各マッチにおける個々の部分マッチにアクセスします。また、指定された正規表現にマッチしなかったシーケンスの部分にアクセスするためにも使用できます(例:トークナイザーとして)。

構築時には std::regex_iterator を構築し、各インクリメント時には現在のmatch_resultsから要求された部分マッチを順次処理し、最後の部分マッチから離れるインクリメント時には基盤となる std::regex_iterator を進める。

デフォルトで構築された std::regex_token_iterator は終端イテレータです。有効な std::regex_token_iterator が最後のマッチの最後のサブマッチに到達した後にインクリメントされると、終端イテレータと等しくなります。これ以降にデリファレンスやインクリメントを行うと未定義動作を引き起こします。

シーケンス終端イテレータになる直前で、 std::regex_token_iterator は suffix iterator になる可能性があります。これは、要求された部分マッチインデックスのリストにインデックス - 1 (非マッチフラグメント)が含まれている場合です。このようなイテレータをデリファレンスすると、最後のマッチとシーケンス終端の間の文字シーケンスに対応するmatch_resultsが返されます。

std::regex_token_iteratorの典型的な実装は、基盤となる std::regex_iterator 、要求された部分マッチインデックスのコンテナ(例: std:: vector < int > )、部分マッチのインデックスと等しい内部カウンタ、現在のマッチの現在の部分マッチを指す std::sub_match へのポインタ、および最後にマッチしなかった文字シーケンス(トークナイザーモードで使用)を含む std::match_results オブジェクトを保持します。

目次

型要件

-
BidirIt は LegacyBidirectionalIterator の要件を満たさなければならない。

特殊化

一般的な文字シーケンス型に対するいくつかの特殊化が定義されています:

定義済みヘッダー <regex>
型 定義
std::cregex_token_iterator std :: regex_token_iterator < const char * >
std::wcregex_token_iterator std :: regex_token_iterator < const wchar_t * >
std::sregex_token_iterator std :: regex_token_iterator < std:: string :: const_iterator >
std::wsregex_token_iterator std :: regex_token_iterator < std:: wstring :: const_iterator >

メンバー型

メンバ型 定義
value_type std:: sub_match < 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 >

メンバー関数

新しい regex_token_iterator を構築する
(public member function)
(destructor)
(implicitly declared)
regex_token_iterator を破棄する(キャッシュされた値を含む)
(public member function)
内容を代入する
(public member function)
(removed in C++20)
2つの regex_token_iterator を比較する
(public member function)
現在のサブマッチにアクセスする
(public member function)
イテレータを次のサブマッチに進める
(public member function)

注記

プログラマーの責任として、イテレータのコンストラクタに渡された std::basic_regex オブジェクトがイテレータよりも長く生存することを保証しなければなりません。なぜなら、イテレータは std::regex_iterator を保持しており、これは正規表現へのポインタを保持しているため、正規表現が破棄された後にイテレータをインクリメントすると未定義動作が発生します。

例

#include <algorithm>
#include <fstream>
#include <iostream>
#include <iterator>
#include <regex>
int main()
{
    // トークン化(非マッチ部分)
    // 正規表現は2回のみマッチすることに注意。3番目の値を取得するとき、
    // イテレータはサフィックスイテレータとなる
    const std::string text = "Quick brown fox.";
    const std::regex ws_re("\\s+"); // 空白文字
    std::copy(std::sregex_token_iterator(text.begin(), text.end(), ws_re, -1),
              std::sregex_token_iterator(),
              std::ostream_iterator<std::string>(std::cout, "\n"));
    std::cout << '\n';
    // 最初のサブマッチを反復処理
    const std::string html = R"(<p><a href="http://google.com">google</a> )"
                             R"(< a HREF ="http:https://ja.cppreference.net">cppreference</a>\n</p>)";
    const std::regex url_re(R"!!(<\s*A\s+[^>]*href\s*=\s*"([^"]*)")!!", std::regex::icase);
    std::copy(std::sregex_token_iterator(html.begin(), html.end(), url_re, 1),
              std::sregex_token_iterator(),
              std::ostream_iterator<std::string>(std::cout, "\n"));
}

出力:

Quick
brown
fox.
http://google.com
https://ja.cppreference.net

不具合報告

以下の動作変更の欠陥報告書は、以前に公開されたC++規格に対して遡及的に適用されました。

DR 適用対象 公開時の動作 正しい動作
LWG 3698
( P2770R0 )
C++20 regex_token_iterator は forward_iterator
でありながらスタッシングイテレータであった
input_iterator [1] に変更
  1. ↑ iterator_category はこの解決策によって変更されませんでした。なぜなら、これを std::input_iterator_tag に変更すると、既存のコードの多くが破壊される可能性があるためです。