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-04
c++項(xiàng)目構(gòu)成從cmake使用基礎(chǔ)詳解
這篇文章主要為大家介紹了c++項(xiàng)目構(gòu)成,從cmake使用基礎(chǔ)開始為大家講解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
C++中靜態(tài)成員函數(shù)與靜態(tài)成員變量(static )
這篇文章主要介紹了C++中靜態(tài)成員函數(shù)與靜態(tài)成員變量(static )的相關(guān)資料,需要的朋友可以參考下2017-06-06
C語言練習(xí)之?dāng)?shù)組中素?cái)?shù)交換
這篇文章主要為大家介紹了C語言數(shù)組中素?cái)?shù)交換,具有一定的參考價值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來幫助<BR>2021-12-12
VC創(chuàng)建進(jìn)程CreateProcess的方法
這篇文章主要介紹了VC創(chuàng)建進(jìn)程CreateProcess的方法,涉及VC操作進(jìn)程的基本技巧,需要的朋友可以參考下2015-05-05

