std:: regex_token_iterator
|
定義先ヘッダ
<regex>
|
||
|
template
<
class
BidirIt,
|
(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]
に変更
|
-
↑
iterator_categoryはこの解決策によって変更されませんでした。なぜなら、これを std::input_iterator_tag に変更すると、既存のコードの多くが破壊される可能性があるためです。