名前空間
変種
操作

std::regex_iterator

提供: cppreference.com
< cpp‎ | regex
template<

    class BidirIt,
    class CharT = typename std::iterator_traits<BidirIt>::value_type,
    class Traits = std::regex_traits<CharT>

> class regex_iterator
(C++11以上)

std::regex_iterator は、ベースとなる文字シーケンス内の、正規表現の個々のマッチにアクセスする、読み込み専用のイテレータです。 逆参照可能な値 a および b について a == b の場合でも *a*b が同じオブジェクトに束縛されないことを除いて、 LegacyForwardIterator の要件を満たします。

構築したとき、および毎回のインクリメントのときに、 std::regex_search が呼ばれ、 その結果が記憶されます (つまり、 std::match_results<BidirIt> の値のコピーが保存されます)。 最初のオブジェクトは、イテレータが構築されたときまたは最初の逆参照が行われたときに読むことができます。 それ以外では、逆参照は最も最近に取得した正規表現マッチのコピーを返すだけです。

デフォルト構築された std::regex_iterator は終端イテレータです。 有効な std::regex_iterator が最後のマッチに達した後にインクリメントされる (std::regex_searchfalse を返す) と、終端イテレータと等しくなります。 以降の逆参照およびインクリメントは未定義動作を発生させます。

std::regex_iterator の一般的な実装は、ベースとなるシーケンスに対する先頭と終端のイテレータ (BidirIt のインスタンス2つ)、正規表現を指すポインタ (const regex_type*)、マッチフラグ (std::regex_constants::match_flag_type)、および現在のマッチ (std::match_results<BidirIt>) を保持します。

目次

[編集] 型要件

-
BidirItLegacyBidirectionalIterator の要件を満たさなければなりません。

[編集] 特殊化

一般的な文字シーケンス型に対していくつかの特殊化が定義されています。

ヘッダ <regex> で定義
定義
cregex_iterator regex_iterator<const char*>
wcregex_iterator regex_iterator<const wchar_t*>
sregex_iterator regex_iterator<std::string::const_iterator>
wsregex_iterator regex_iterator<std::wstring::const_iterator>

[編集] メンバ型

メンバ型 定義
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
regex_type basic_regex<CharT, Traits>

[編集] メンバ関数

新しい regex_iterator を構築します
(パブリックメンバ関数) [edit]
デストラクタ
(暗黙に宣言)
キャッシュされている値を含め、 regex_iterator を破棄します
(パブリックメンバ関数) [edit]
内容を代入します
(パブリックメンバ関数) [edit]
(C++20で削除)
2つの regex_iterator を比較します
(パブリックメンバ関数) [edit]
現在のマッチにアクセスします
(パブリックメンバ関数) [edit]
イテレータを次のマッチに進めます
(パブリックメンバ関数) [edit]

[編集] ノート

イテレータのコンストラクタに渡した std::basic_regex オブジェクトがイテレータより長生きすることを保証することはプログラマの責任です。 イテレータは regex を指すポインタを格納しているため、 regex が破棄された後のイテレータはダングリングポインタをアクセスします。

正規表現のマッチした部分がアサーション (^, $, \b, \B) のみの場合、そのマッチは長さゼロのマッチ、つまり、 match[0].first == match[0].second をイテレータに格納します。

[編集]

#include <regex>
#include <iterator>
#include <iostream>
#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.

[編集] 関連項目

すべての部分表現のマッチを含む1つの正規表現マッチを識別します
(クラステンプレート) [edit]
文字シーケンスの任意の部分への正規表現のマッチを試みます
(関数テンプレート) [edit]