簡體   English   中英

使用std :: regex_iterator <std::string::iterator> 根據CPlusPlus.com

[英]Use of std::regex_iterator<std::string::iterator> according to CPlusPlus.com

我正在閱讀std::regex_iterator<std::string::iterator>上的文檔,因為我試圖學習如何使用它來解析HTML標簽。 該網站提供的示例是

#include <iostream>
#include <string>
#include <regex>

int main ()
{
  std::string s ("this subject has a submarine as a subsequence");
  std::regex e ("\\b(sub)([^ ]*)");   // matches words beginning by "sub"

  std::regex_iterator<std::string::iterator> rit ( s.begin(), s.end(), e );
  std::regex_iterator<std::string::iterator> rend;

  while (rit!=rend) {
    std::cout << rit->str() << std::endl;
    ++rit;
  }

  return 0;
}

http://www.cplusplus.com/reference/regex/regex_iterator/regex_iterator/

我對此有一個問題:如果rend從未初始化,那么它如何在rit!=rend被有意義地使用?

另外,我應該使用該工具從HTML標簽中獲取屬性嗎? 我想做的是采用一個字符串,例如"class='class1 class2' id = 'myId' onclick ='myFunction()' >"然后分成對

"class""class1 class2" ),( "id""myId" ),( "onclick""myFunction()"

然后從那里與他們合作。 我打算使用的正則表達式是

([A-Za-z0-9\\-]+)\\s*=\\s*(['\"])(.*?)\\2

因此,我計划遍歷該類型的表達式,同時跟蹤我是否仍在標記中(即是否傳遞了'>'字符)。 這樣做太難了嗎?

感謝您提供的指導。

您對“如果未初始化rend是什么意思? 顯然, std::regex_iterator<I>具有默認的構造函數。 由於迭代僅是正向迭代,因此最終迭代器只需要是某種適合於檢測使用了結束的迭代器即可。 默認構造函數可以相應地設置rend

這是標准C ++庫中其他幾個地方使用的慣用法,例如,用於std::istream_iterator<T> 理想情況下,可以使用其他類型來指示最終迭代器(例如,參見Eric Niebler對此問題的討論 ,鏈接指向四頁的第一頁),但是該標准目前要求使用算法時,這兩種類型必須匹配。

關於使用正則表達式解析HTML,請參考此答案

rend不是未初始化的,它是默認構造的。 您鏈接的頁面很清楚:

默認構造函數(1)構造一個序列結束迭代器。

由於默認構造似乎是獲得序列結束迭代器的唯一方法,因此比較ritrend是測試rit是否耗盡的正確方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM