- regex[meta header]
- std[meta namespace]
- regex_iterator[meta class]
- function[meta id-type]
- cpp11[meta cpp]
regex_iterator& operator++(); // (1) 前置形式
regex_iterator operator++(int); // (2) 後置形式イテレータを次のマッチに進める
シーケンスの終端を示すイテレータではない事。(シーケンス終端イテレータに対して呼び出した場合は未定義動作となる)
-
(1) の形式(前置形式)は、以下のように振る舞う。
BidirectionalIterator型のローカル変数startを構築し、値match[0].secondで初期化する。- イテレータが長さゼロのマッチの場合(
match[0].matched == trueかつmatch[0].first == match[0].secondの場合)で、かつ、start == endの場合、*thisをシーケンス終端イテレータにして*thisを返す。 - そうではなくて、イテレータが長さゼロのマッチの場合、
regex_search(start, end, match, *pregex, flags | regex_constants::match_not_null | regex_constants::match_continuous)を呼び出す。
もしマッチしたら(trueが返されたら)、*thisを返す。マッチしなかったら、startをインクリメントし、イテレータが長さゼロのマッチで無いかのように、以下の処理を続ける。 - イテレータが長さゼロのマッチでない場合、
flagsをflags | regex_constants ::match_prev_availに更新し、regex_search(start, end, match, *pregex, flags)を呼び出す。
もしマッチしなかったら、*thisをシーケンス終端イテレータにする。その後、*thisを返す。 - 上記のうち、
regex_searchがtrueを返した全てのケースでは、以下の補正が行われる。match.prefix().firstを直前のmatch[0].secondに設定する。- 半開区間
[0, match.size())の全てのインデックスiについて、match[i].matchedがtrueであれば、match.position(i)がdistance(begin, match[i].first)を返すように設定する。
-
(2) の形式(後置形式)は、以下のように振る舞う。
regex_iterator tmp = *this; ++(*this); return tmp;
- (1)
*this - (2) インクリメントを行う前の
*thisのコピー
- メンバ変数
begin、end、pregex、flags、matchはあくまでも説明用のプライベートメンバ変数であるため、注意すること。 - 「効果」にあるように、
matchには検索後に補正が行われるため、regex_iteratorを間接参照した結果は、regex_searchを順に呼び出した結果とは異なる。
また、これらの補正が実装でどのように行われるかについては、規格では規定されていない。 - 「効果」では
regex_searchが呼ばれるものとして記載されているが、実際にregex_searchが呼ばれるかどうかについては、規格では規定されていない。
したがって、regex_searchにユーザ定義の特殊化バージョンを提供しても、呼ばれないかもしれない。
#include <iostream>
#include <iterator>
#include <regex>
#include <string>
int main()
{
std::regex re("a*|b*|c*");
std::string s("aaabbbccc");
for (std::sregex_iterator it(std::begin(s), std::end(s), re), end; it != end; ++it) {
std::cout << "position = " << it->position() << ", length = " << it->length() << ", str = '" << it->str() << "', prefix = '" << it->prefix() << '\'' << std::endl;
}
}- ++it[color ff0000]
- std::regex[link /reference/regex/basic_regex.md]
- position()[link /reference/regex/match_results/position.md]
- length()[link /reference/regex/match_results/length.md]
- str()[link /reference/regex/match_results/str.md]
- prefix()[link /reference/regex/match_results/prefix.md]
position = 0, length = 3, str = 'aaa', prefix = ''
position = 3, length = 0, str = '', prefix = ''
position = 3, length = 3, str = 'bbb', prefix = ''
position = 6, length = 0, str = '', prefix = ''
position = 6, length = 3, str = 'ccc', prefix = ''
position = 9, length = 0, str = '', prefix = ''
注意:Clang & libc++ では正常に実行されない(終了しなくなってしまう)。また、GCC & libstdc++ の 4.9.1 までのバージョンでは、結果が正しくない。
- C++11
- Clang: 3.0, 3.1, 3.2, 3.3, 3.4, 3.5, 3.6
- GCC: 4.9.0, 4.9.1, 5.0.0
- ICC: ??
- Visual C++: ??
Clang & libc++ と GCC & libstdc++ の 4.9.1 までのバージョンには、長さ 0 の文字列にマッチした時の挙動に問題があるため、注意が必要。 (特に、Clang は長さ 0 の文字列にマッチするとそこから先に進まなくなってしまう。例を参照)
| 名前 | 説明 | 対応バージョン |
|---|---|---|
(constructor) |
コンストラクタ | C++11 |
operator* |
間接参照 | C++11 |
operator-> |
メンバアクセス | C++11 |
operator== |
等値比較 | C++11 |