std::regex_iterator
| ヘッダ <regex> で定義 |
||
| template< class BidirIt, |
(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 の典型的な実装は、基になるシーケンスの開始および終了イテレータ(BidiIt の2つのインスタンス)、正規表現へのポインタ(const regex_type*)、マッチフラグ(std::regex_constants::match_flag_type)、および現在のマッチ(std::match_results<BidirIt>)を保持します。
目次 |
[edit] 型要件
-BidirIt は LegacyBidirectionalIterator の要件を満たしている必要があります。 |
[edit] 特殊化
一般的な文字シーケンス型のためのいくつかの特殊化が定義されています。
| ヘッダ
<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> |
[edit] メンバ型
| 型 | 定義 |
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> |
[edit] メンバ変数
| メンバ | 説明 |
BidiIt begin (private) |
開始イテレータ (説明用のメンバオブジェクト*) |
BidiIt end (private) |
終了イテレータ (説明用のメンバオブジェクト*) |
const regex_type* pregex (private) |
正規表現へのポインタ (説明用のメンバオブジェクト*) |
regex_constants::match_flag_type flags (private) |
フラグ (説明用のメンバオブジェクト*) |
match_results<BidirIt> match (private) |
現在のマッチ (説明用のメンバオブジェクト*) |
[edit] メンバ関数
新しいregex_iteratorを構築します。(public member function) | |
| (デストラクタ) (暗黙的に宣言) |
キャッシュされた値を含むregex_iteratorを破棄します。(public member function) |
| 内容を代入する (public member function) | |
| (C++20で削除) |
2つのregex_iteratorを比較します。(public member function) |
| 現在のマッチにアクセスします。 (public member function) | |
| イテレータを次のマッチに進めます。 (public member function) |
[edit] 注記
イテレータのコンストラクタに渡される std::basic_regex オブジェクトがイテレータよりも長く生存することを保証するのはプログラマの責任です。イテレータは正規表現へのポインタを格納するため、正規表現が破棄された後にイテレータをインクリメントすると、ダングリングポインタにアクセスすることになります。
正規表現の一部がアサーション(^、$、\b、\B)である場合、イテレータに格納されるマッチはゼロ長の Сmatch です。つまり、match[0].first == match[0].second となります。
[edit] 例
#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.
[edit] 不具合報告
以下の動作変更を伴う欠陥報告が、以前に公開されたC++標準に遡って適用されました。
| DR | 適用対象 | 公開された動作 | 正しい動作 |
|---|---|---|---|
| LWG 3698 (P2770R0) |
C++20 | regex_iterator は、forward_iterator でしたが、stashing iterator であったため、 |
input_iterator になりました[1] |
- ↑
iterator_categoryは、std::input_iterator_tagに変更すると既存のコードに too much 影響を与える可能性があるため、解決によって変更されませんでした。
[edit] 関連項目
| (C++11) |
すべての部分式マッチを含む、1つの正規表現マッチを識別する (クラステンプレート) |
| (C++11) |
正規表現を文字シーケンスの任意の部分にマッチさせようと試みる (関数テンプレート) |