名稱空間
變體
操作

std::regex_iterator

來自 cppreference.com
< cpp‎ | regex
 
 
 
正則表示式庫
(C++11)
演算法
迭代器
regex_iterator
(C++11)
異常
特性
常量
(C++11)
正則表示式語法
 
 
在標頭檔案 <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 是一個只讀迭代器,用於訪問底層字元序列中正則表示式的各個匹配項。它滿足 LegacyForwardIterator 的要求,但對於可解引用值 aba == 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]
  1. iterator_category 沒有因決議而改變,因為將其更改為 std::input_iterator_tag 可能會破壞太多現有程式碼。

[編輯] 參見

標識一個正則表示式匹配,包括所有子表示式匹配
(類模板) [編輯]
嘗試將正則表示式與字元序列的任何部分匹配
(函式模板) [編輯]