std::regex_iterator
template< class BidirIt, |
(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_search が false を返す) と、終端イテレータと等しくなります。 以降の逆参照およびインクリメントは未定義動作を発生させます。
std::regex_iterator
の一般的な実装は、ベースとなるシーケンスに対する先頭と終端のイテレータ (BidirIt のインスタンス2つ)、正規表現を指すポインタ (const regex_type*)、マッチフラグ (std::regex_constants::match_flag_type)、および現在のマッチ (std::match_results<BidirIt>) を保持します。
目次 |
[編集] 型要件
-BidirIt は LegacyBidirectionalIterator の要件を満たさなければなりません。
|
[編集] 特殊化
一般的な文字シーケンス型に対していくつかの特殊化が定義されています。
ヘッダ
<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 を構築します (パブリックメンバ関数) | |
デストラクタ (暗黙に宣言) |
キャッシュされている値を含め、 regex_iterator を破棄します (パブリックメンバ関数) |
内容を代入します (パブリックメンバ関数) | |
(C++20で削除) |
2つの regex_iterator を比較します (パブリックメンバ関数) |
現在のマッチにアクセスします (パブリックメンバ関数) | |
イテレータを次のマッチに進めます (パブリックメンバ関数) |
[編集] ノート
イテレータのコンストラクタに渡した 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.
[編集] 関連項目
(C++11) |
すべての部分表現のマッチを含む1つの正規表現マッチを識別します (クラステンプレート) |
(C++11) |
文字シーケンスの任意の部分への正規表現のマッチを試みます (関数テンプレート) |