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
的典型實現包含底層序列的開始和結束迭代器(兩個 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 (私有) |
開始迭代器 (僅用於闡釋的成員物件*) |
BidiIt end (私有) |
結束迭代器 (僅用於闡釋的成員物件*) |
const regex_type* pregex (私有) |
指向正則表示式的指標 (僅用於闡釋的成員物件*) |
regex_constants::match_flag_type flags (私有) |
一個標誌 (僅用於闡釋的成員物件*) |
match_results<BidiIt> match (私有) |
當前匹配 (僅用於闡釋的成員物件*) |
[編輯] 成員函式
構造新的 regex_iterator (公有成員函式) | |
(解構函式) (隱式宣告) |
銷燬 regex_iterator ,包括快取值(公有成員函式) |
賦值內容 (公有成員函式) | |
(在 C++20 中移除) |
比較兩個 regex_iterator (公有成員函式) |
訪問當前匹配 (公有成員函式) | |
將迭代器推進到下一個匹配項 (公有成員函式) |
[編輯] 注意
程式設計師有責任確保傳遞給迭代器建構函式的 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++ 標準。
缺陷報告 | 應用於 | 釋出時的行為 | 正確的行為 |
---|---|---|---|
LWG 3698 (P2770R0) |
C++20 | regex_iterator 曾是 forward_iterator 同時也是一個暫存迭代器 |
現已成為 input_iterator [1] |
- ↑
iterator_category
沒有因決議而改變,因為將其更改為 std::input_iterator_tag 可能會破壞太多現有程式碼。
[編輯] 參見
(C++11) |
標識一個正則表示式匹配,包括所有子表示式匹配 (類模板) |
(C++11) |
嘗試將正則表示式與字元序列的任何部分匹配 (函式模板) |