C++字符串提取和分割的多種方法
1. 字符串提取的基本方法
1.1 使用 std::istringstream 和 >> 操作符
std::istringstream
是 C++ 標(biāo)準(zhǔn)庫中的一個類,它將字符串作為輸入流來處理。通過 >>
操作符,我們可以從流中提取以空格分隔的單詞或數(shù)字。
示例代碼
#include <iostream> #include <sstream> #include <string> int main() { std::string s = "id13 id1 id6 id0 id8 id6 id0"; std::istringstream iss(s); std::string token; while (iss >> token) { std::cout << token << std::endl; } return 0; }
輸出
id13 id1 id6 id0 id8 id6 id0
分析
iss >> token
會按空格分隔字符串,逐個提取單詞。這種方法適用于字符串中的單詞是用空格分隔的簡單場景。
1.2 提取 id 后面的數(shù)字
如果需要從類似 "id13 id1 id6"
的字符串中提取 id
后面的數(shù)字,可以使用 std::string::substr
方法。
示例代碼
#include <iostream> #include <sstream> #include <string> #include <vector> int main() { std::string s = "id13 id1 id6 id0 id8 id6 id0"; std::istringstream iss(s); std::string token; std::vector<int> ids; while (iss >> token) { if (token.substr(0, 2) == "id") { int id = std::stoi(token.substr(2)); ids.push_back(id); } } for (int id : ids) { std::cout << id << std::endl; } return 0; }
輸出
13 1 6 0 8 6 0
分析
token.substr(2)
從token
的第 2 個字符開始提取子串,跳過"id"
。無論
id
后面的數(shù)字是一位數(shù)、兩位數(shù)還是三位數(shù),substr(2)
都能正確提取。這種方法簡潔高效,適用于提取固定前綴后的數(shù)字。
2. 處理復(fù)雜分隔符
2.1 使用 std::getline 自定義分隔符
如果字符串的分隔符不是空格(例如逗號 ,
或分號 ;
),可以使用 std::getline
并指定分隔符。
示例代碼
#include <iostream> #include <sstream> #include <string> #include <vector> int main() { std::string s = "id13,id1,id6,id0,id8,id6,id0"; std::istringstream iss(s); std::string token; std::vector<int> ids; while (std::getline(iss, token, ',')) { if (token.substr(0, 2) == "id") { int id = std::stoi(token.substr(2)); ids.push_back(id); } } for (int id : ids) { std::cout << id << std::endl; } return 0; }
輸出
13 1 6 0 8 6 0
分析
std::getline(iss, token, ',')
會按逗號分隔字符串,逐個提取單詞。這種方法適用于處理自定義分隔符的場景。
2.2 處理多行輸入
如果輸入是多行的,std::getline
也可以按行提取內(nèi)容。
示例代碼
#include <iostream> #include <sstream> #include <string> int main() { std::string s = "id13 id1 id6\nid0 id8 id6\nid0"; std::istringstream iss(s); std::string line; while (std::getline(iss, line)) { std::istringstream lineStream(line); std::string token; while (lineStream >> token) { std::cout << token << std::endl; } } return 0; }
輸出
id13 id1 id6 id0 id8 id6 id0
分析
外層
std::getline
按行提取內(nèi)容。內(nèi)層
lineStream >> token
按空格分隔每行的單詞。這種方法適用于處理多行輸入的場景。
3. 高級字符串處理技巧
3.1 使用正則表達(dá)式
C++11 引入了 <regex>
庫,支持正則表達(dá)式匹配,可以更靈活地處理字符串。
示例代碼
#include <iostream> #include <regex> #include <string> #include <vector> int main() { std::string s = "id13 id1 id6 id0 id8 id6 id0"; std::regex pattern(R"(id(\d+))"); std::smatch matches; std::vector<int> ids; auto words_begin = std::sregex_iterator(s.begin(), s.end(), pattern); auto words_end = std::sregex_iterator(); for (std::sregex_iterator i = words_begin; i != words_end; ++i) { std::smatch match = *i; int id = std::stoi(match.str(1)); ids.push_back(id); } for (int id : ids) { std::cout << id << std::endl; } return 0; }
輸出
13 1 6 0 8 6 0
分析
使用正則表達(dá)式
R"(id(\d+))"
匹配id
后面的數(shù)字。這種方法 功能強(qiáng)大,但語法較復(fù)雜,適合處理復(fù)雜的字符串匹配任務(wù)。
3.2 性能優(yōu)化
對于大規(guī)模數(shù)據(jù)處理,性能可能成為瓶頸。可以通過以下方法優(yōu)化:
避免頻繁創(chuàng)建和銷毀
std::istringstream
對象。使用
std::string_view
(C++17)減少字符串拷貝。
示例代碼
#include <iostream> #include <sstream> #include <string> #include <vector> int main() { std::string s = "id13 id1 id6 id0 id8 id6 id0"; std::istringstream iss(s); std::string token; std::vector<int> ids; ids.reserve(10); // 預(yù)分配空間 while (iss >> token) { if (token.substr(0, 2) == "id") { int id = std::stoi(token.substr(2)); ids.push_back(id); } } for (int id : ids) { std::cout << id << std::endl; } return 0; }
分析
預(yù)分配
ids
的空間可以減少動態(tài)內(nèi)存分配的開銷。使用
std::string_view
可以避免不必要的字符串拷貝。
4. 總結(jié)
本文詳細(xì)介紹了 C++ 中字符串提取和分割的多種方法,包括:
使用
std::istringstream
和>>
操作符按空格分隔字符串。使用
std::getline
處理自定義分隔符和多行輸入。使用正則表達(dá)式處理復(fù)雜的字符串匹配任務(wù)。
通過性能優(yōu)化技巧提高代碼效率。
每種方法都有其適用的場景和優(yōu)缺點(diǎn),開發(fā)者可以根據(jù)具體需求選擇合適的方法。掌握這些技巧后,你將能夠高效地處理各種字符串任務(wù),提升代碼的可讀性和性能。
以上就是C++字符串提取和分割的多種方法的詳細(xì)內(nèi)容,更多關(guān)于C++字符串提取和分割的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
C++利用jsoncpp庫實(shí)現(xiàn)寫入和讀取json文件
JsonCpp 是一個C++庫,允許操作 JSON 值,包括序列化和反序列化到字符串和從字符串反序列化。本文主要介紹了如何利用jsoncpp庫實(shí)現(xiàn)寫入和讀取json文件,感興趣的可以了解一下2023-04-04c++項(xiàng)目構(gòu)成從cmake使用基礎(chǔ)詳解
這篇文章主要為大家介紹了c++項(xiàng)目構(gòu)成,從cmake使用基礎(chǔ)開始為大家講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11C++中靜態(tài)成員函數(shù)與靜態(tài)成員變量(static )
這篇文章主要介紹了C++中靜態(tài)成員函數(shù)與靜態(tài)成員變量(static )的相關(guān)資料,需要的朋友可以參考下2017-06-06C語言練習(xí)之?dāng)?shù)組中素數(shù)交換
這篇文章主要為大家介紹了C語言數(shù)組中素數(shù)交換,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>2021-12-12VC創(chuàng)建進(jìn)程CreateProcess的方法
這篇文章主要介紹了VC創(chuàng)建進(jìn)程CreateProcess的方法,涉及VC操作進(jìn)程的基本技巧,需要的朋友可以參考下2015-05-05