最終更新日時:
が更新

履歴 編集

function
<regex>

std::regex_token_iterator::operator++(C++11)

regex_token_iterator& operator++();   // (1) 前置形式

regex_token_iterator operator++(int); // (2) 後置形式

概要

イテレータを次のサブマッチに進める

要件

シーケンスの終端を示すイテレータではない事。(シーケンス終端イテレータに対して呼び出した場合は未定義動作となる)

効果

  • (1) の形式(前置形式)は、以下のように振る舞う。
    • value_type 型(sub_match<BidirectionalIterator>)のローカル変数 prev を構築し、値 position->suffix() で初期化する。
    • *this が接尾辞イテレータであれば、 *this をシーケンス終端イテレータに設定する。
    • そうでなくて、N + 1 < subs.size() であれば、N をインクリメントし result を現在のマッチ(備考参照)のアドレスに設定する。
    • そうでなければ、N0 に設定し、position をインクリメントする。
      • position がシーケンス終端イテレータでなければ、result を現在のマッチのアドレスに設定する。
      • そうでなくて、subs-1 を含んでいて、かつ、prev.length()0 でなければ、 *this を範囲 [prev.first, prev.second) を指す接尾辞イテレータに設定する。
      • そうでなければ、*this をシーケンス終端イテレータに設定する。
  • (2) の形式(後置形式)は、以下のように振る舞う。

    regex_token_iterator tmp = *this;
    ++(*this);
    return tmp;
    

戻り値

  • (1) *this
  • (2) インクリメントを行う前の *this のコピー

備考

  • 「現在のマッチ」とは、もし subs[N]-1 の場合には (*position).prefix()、そうでなければ (*position).[subs[N]] の事を指す。
  • メンバ変数 positionNsubsresult はあくまでも説明用のプライベートメンバ変数であるため、注意すること。

#include <iostream>
#include <iterator>
#include <regex>
#include <string>
#include <initializer_list>

void f(std::initializer_list<int> submatches)
{
  static const std::string s("enum E { enumerator1 = value1, enumerator2 = value2, enumerator3 = value3, };");
  static const std::regex re(R"((\w+)\s*=\s*(\w+))");

  // 引数で指定されたサブマッチを列挙する。
  for (std::sregex_token_iterator it(std::begin(s), std::end(s), re, submatches), end; it != end; ++it) {
    std::cout << "match range = (" << it->first - std::begin(s) << ", " << it->second - std::begin(s) << "), "
                 "str = '" << it->str() << "'\n";
  }
  std::cout << std::endl;
}

int main()
{
  // 列挙子と値の両方を抽出
  f({ 1, 2 });

  // マッチしない部分のみ抽出
  f({ -1 });
}

出力

match range = (9, 20), str = 'enumerator1'
match range = (23, 29), str = 'value1'
match range = (31, 42), str = 'enumerator2'
match range = (45, 51), str = 'value2'
match range = (53, 64), str = 'enumerator3'
match range = (67, 73), str = 'value3'

match range = (0, 9), str = 'enum E { '
match range = (29, 31), str = ', '
match range = (51, 53), str = ', '
match range = (73, 77), str = ', };'

バージョン

言語

  • C++11

処理系

備考

Clang & libc++ と GCC & libstdc++ の 4.9.1 までのバージョンには、長さ 0 の文字列にマッチした時の挙動に問題があるため、注意が必要。 (特に、Clang は長さ 0 の文字列にマッチするとそこから先に進まなくなってしまう)

参照

名前 説明 対応バージョン
(constructor) コンストラクタ C++11
operator* 間接参照 C++11
operator-> メンバアクセス C++11
operator== 等値比較 C++11