[英]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)構造一個序列結束迭代器。
由於默認構造似乎是獲得序列結束迭代器的唯一方法,因此比較rit
與rend
是測試rit
是否耗盡的正確方法。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.