std:: regex_iterator
|
定義於ヘッダ
<regex>
|
||
|
template
<
class
BidirIt,
|
(C++11以降) | |
std::regex_iterator
は、基となる文字シーケンス内の正規表現の個々のマッチにアクセスする読み取り専用イテレータです。これは
LegacyForwardIterator
の要件を満たしますが、デリファレンス可能な値
a
と
b
が
a
==
b
を満たす場合でも、
*
a
と
*
b
が同じオブジェクトに束縛されない点が例外です。
構築時およびすべてのインクリメント時に、 std::regex_search を呼び出し、結果を保存します(つまり、 std:: match_results < BidirIt > の値のコピーを保存します)。最初のオブジェクトは、イテレータが構築された時点、または最初のデリファレンスが実行された時点で読み取られる可能性があります。それ以外の場合、デリファレンスは直近に取得された正規表現マッチのコピーのみを返します。
デフォルト構築された
std::regex_iterator
は終端イテレータです。有効な
std::regex_iterator
が最後のマッチに到達した後にインクリメントされると(
std::regex_search
が
false
を返す)、それは終端イテレータと等しくなります。これに対してさらにデリファレンスやインクリメントを行うと未定義動作が発生します。
std::regex_iterator
の典型的な実装は、基になるシーケンスの先頭イテレータと終端イテレータ(2つの
BidirIt
インスタンス)、正規表現へのポインタ(
const
regex_type
*
)、マッチフラグ(
std::regex_constants::match_flag_type
)、および現在のマッチ(
std::
match_results
<
BidirIt
>
)を保持します。
目次 |
型要件
-
BidirIt
は
LegacyBidirectionalIterator
の要件を満たさなければならない。
|
特殊化
一般的な文字シーケンス型に対するいくつかの特殊化が定義されています:
|
ヘッダーで定義
<regex>
|
|
| 型 | 定義 |
std::cregex_iterator
|
std :: regex_iterator < const char * > |
std::wcregex_iterator
|
std :: regex_iterator < const wchar_t * > |
std::sregex_iterator
|
std :: regex_iterator < std:: string :: const_iterator > |
std::wsregex_iterator
|
std :: 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 |
iterator_concept
(C++20)
|
std::input_iterator_tag |
regex_type
|
std:: basic_regex < CharT, Traits > |
データメンバ
| メンバー | 説明 |
BidiIt
begin
(private)
|
開始イテレータ
( 説明専用メンバーオブジェクト* ) |
BidiIt
end
(private)
|
終了イテレータ
( 説明専用メンバーオブジェクト* ) |
const
regex_type
*
pregex
(private)
|
正規表現へのポインタ
( 説明専用メンバーオブジェクト* ) |
regex_constants
::
match_flag_type
flags
(private)
|
フラグ
( 説明専用メンバーオブジェクト* ) |
match_results
<
BidiIt
>
match
(private)
|
現在のマッチ
( 説明専用メンバーオブジェクト* ) |
メンバー関数
新しい
regex_iterator
を構築する
(public member function) |
|
|
(destructor)
(implicitly declared)
|
regex_iterator
を破棄する(キャッシュされた値を含む)
(public member function) |
|
内容を代入する
(public member function) |
|
|
(removed in C++20)
|
2つの
regex_iterator
を比較する
(public member function) |
|
現在のマッチにアクセスする
(public member function) |
|
|
イテレータを次のマッチに進める
(public member function) |
注記
イテレータのコンストラクタに渡された std::basic_regex オブジェクトがイテレータよりも長く生存することを保証するのはプログラマの責任です。イテレータが正規表現へのポインタを保持しているため、正規表現が破棄された後にイテレータをインクリメントするとダングリングポインタにアクセスすることになります。
正規表現のマッチ部分が単なる
アサーション
(
^
,
$
,
\b
,
\B
) である場合、イテレータに格納されるマッチは長さゼロのマッチ、すなわち
match
[
0
]
.
first
==
match
[
0
]
.
second
となります。
例
#include <iostream> #include <iterator> #include <regex> #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++規格に対して遡及的に適用されました。
| DR | 適用対象 | 公開時の動作 | 正しい動作 |
|---|---|---|---|
|
LWG 3698
( P2770R0 ) |
C++20 |
regex_iterator
はスタッシングイテレータであるにもかかわらず
forward_iterator
であった
|
input_iterator
[1]
に変更
|
-
↑
iterator_categoryはこの解決策によって変更されませんでした。なぜなら、これを std::input_iterator_tag に変更すると、既存のコードの多くが破壊される可能性があるためです。
関連項目
|
(C++11)
|
正規表現のマッチ、およびすべての部分式のマッチを識別する
(クラステンプレート) |
|
(C++11)
|
文字シーケンスの任意の部分に正規表現のマッチを試みる
(関数テンプレート) |