最終更新日時:
が更新

履歴 編集

class template
<regex>

std::regex_iterator(C++11)

namespace std {
  template <class BidirectionalIterator,
            class charT = typename iterator_traits<BidirectionalIterator>::value_type,
            class traits = regex_traits<charT> >
  class regex_iterator;

  typedef regex_iterator<const char*> cregex_iterator;
  typedef regex_iterator<const wchar_t*> wcregex_iterator;
  typedef regex_iterator<string::const_iterator> sregex_iterator;
  typedef regex_iterator<wstring::const_iterator> wsregex_iterator;
}

概要

regex_iterator は、ある文字列に対して、指定した正規表現で検索した結果を順番に列挙する読み取り専用の前方向イテレータである。

regex_iterator オブジェクトを構築した時、および、operator++ を呼び出す毎に、当該イテレータは regex_search を呼び出して検索し、マッチ結果オブジェクト(match_results)を内部に保存する(ただし、operator++ も参照)。 イテレータが終端まで来たとき(つまり、regex_searchfalse を返したとき)、当該イテレータはシーケンスの終端を示す特別な値となる。 この、シーケンスの終端を示す特別な値は、regex_iterator オブジェクトをデフォルトコンストラクタにより構築した場合にも生成されるため、この値と比較することによってシーケンスの終端であるか否か(つまり、マッチしなかったか否か)が判別できる。

シーケンス終端のイテレータに対する operator* 演算子適用は未定義である。その他のイテレータに対する operator* 演算子適用の結果は const match_results<BidirectionalIterator>& である。
同様に、シーケンス終端のイテレータに対する operator-> 演算子適用は未定義である。その他のイテレータに対する operator-> 演算子適用の結果は const match_results<BidirectionalIterator>* である。

なお、本サイトの regex_iterator の各説明では、規格にならって以下のプライベートなメンバ変数が存在する前提で記載している。

  • 検索対象文字列の開始位置を示すイテレータ beginBidirectionalIterator 型)
  • 検索対象文字列の終了位置を示すイテレータ endBidirectionalIterator 型)
  • 検索する正規表現へのポインタ pregexconst basic_regex<charT, traits>* 型。正規表現のコピーではないことに注意)
  • 検索フラグ flagsregex_constants::match_flag_type 型)
  • 最後の検索のマッチ結果オブジェクト matchmatch_results<BidirectionalIterator 型)

しかし、規格上これらのメンバ変数は説明のためだけに導入されているため、実際の各実装でこれらのメンバ変数が存在するとは限らない事に注意すること。

regex_iteratoriterator_categoryforward_iterator_tag に定義しているため、基本的には前方向イテレータであると考えられるが、実際には前方向イテレータの要件のうち以下の要件を満たしていない。

  • 2 つの間接参照可能な regex_iterator オブジェクト ab がある時、a == b の場合でも、++a == ++b とは限らない。
  • 2 つの間接参照可能な regex_iterator オブジェクト ab がある時、a == b の場合でも、*a*b が同じオブジェクトとは限らない。

メンバ関数

構築・破棄

名前 説明 対応バージョン
(constructor) コンストラクタ C++11
operator= 代入演算子 C++11

比較

名前 説明 対応バージョン
operator== 等値比較 C++11
operator!= 非等値比較 C++11

間接

名前 説明 対応バージョン
operator* 間接参照 C++11
operator-> メンバアクセス C++11

インクリメント

名前 説明 対応バージョン
operator++ インクリメント C++11

メンバ型

名前 説明 対応バージョン
regex_type マッチに使用している正規表現型。basic_regex<charT, traits> の typedef C++11
value_type マッチ結果の型(間接参照で返される型)。match_results<BidirectionalIterator> の typedef C++11
difference_type 2 つのイテレータの差を表すための型。ptrdiff_t の typedef C++11
pointer const value_type へのポインタ C++11
reference const value_type への参照 C++11
iterator_category このイテレータのカテゴリを表すタグ。前方向イテレータ(forward_iterator_tag C++11

説明用プライベートメンバ変数

名前 説明 対応バージョン
begin 検索対象文字列の開始位置を示すイテレータ。BidirectionalIterator C++11
end 検索対象文字列の終了位置を示すイテレータ。BidirectionalIterator C++11
pregex 検索する正規表現へのポインタ。正規表現のコピーではないことに注意。const basic_regex<charT, traits>* C++11
flags 検索フラグ。regex_constants::match_flag_type C++11
match 最後の検索のマッチ結果オブジェクト。match_results<BidirectionalIterator C++11

非メンバ型

名前 説明 対応バージョン
cregex_iterator regex_iterator<const char*> の typedef C++11
wcregex_iterator regex_iterator<const wchar_t*> の typedef C++11
sregex_iterator regex_iterator<string::const_iterator> の typedef C++11
wsregex_iterator regex_iterator<wstring::const_iterator> の typedef C++11

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

int main()
{
  std::string s("a01da123456da999d");
  std::regex re("\\d+");

  for (std::sregex_iterator it(std::begin(s), std::end(s), re), end; it != end; ++it) {
    auto&& m = *it;
    std::cout << "position = " << m.position() << ", length = " << m.length() << ", str = '" << m.str() << '\'' << std::endl;
  }
}

出力

position = 1, length = 2, str = '01'
position = 5, length = 6, str = '123456'
position = 13, length = 3, str = '999'

バージョン

言語

  • C++11

処理系

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