<regex> 方案C++11 引入 std::regex,配合 std::sregex_token_iterator 可輕鬆實現分割,且自動處理連續分隔符、邊界情況。
#include#include #include #include using namespace std; vector splitString(const string& str) { regex pattern(R"([\s,]+)"); // 正則:一個或多個空白或逗號 sregex_token_iterator it(str.begin(), str.end(), pattern, -1); sregex_token_iterator end; vector tokens; for (; it != end; ++it) { if (!it->str().empty()) // 可選:過濾空串 tokens.push_back(it->str()); } return tokens; } int main() { string input = "apple, banana, cherry ,date"; auto parts = splitString(input); for (const auto& s : parts) cout << '[' << s << ']'; // 輸出:[apple][banana][cherry][date] return 0; }
pattern:[\s,]+ 匹配任意空白字符(空格、制表、換行)或逗號,**+ 表示一個或多個**,自動合併連續分隔符sregex_token_iterator 構造函數第 4 參數 -1 表示**返回非匹配部分**(即分割出的 token),默認 0 返回匹配部分| 方法 | 優點 | 缺點 | 適用場景 |
|---|---|---|---|
| stringstream + getline | 標準、簡單 | 單字符分隔符、需手動處理連續分隔符 | 簡單 CSV、單分隔符 |
| strtok / strtok_r | C 風格、零分配 | 破壞原串、非線程安全、單字符分隔符 | C 代碼、極致性能 |
| 手寫循環 find/substr | 完全可控、無依賴 | 代碼冗長、易出錯 | 特殊邏輯、嵌入式無 STL |
| regex + token_iterator | 正則強大、自動合併分隔符、代碼極簡 | 編譯正則有開銷、極高頻調用性能稍弱 | 通用分割、多字符/正則分隔符 |
regex pattern 靜態化或傳入預編譯對象string_view + 手寫循環更快std::string_view 可避免分割時的內存拷貝