如何按指定规则分割字符串并存储到std::vector<string>中?
解决C++字符串分割问题:提取合法子串到vector
嘿,这个需求其实用C++标准库就能轻松搞定,不用自己造轮子~这里给你两种实用方案,你可以根据习惯选择:
方案一:正则表达式实现(推荐,代码更简洁)
我们可以直接用正则匹配所有符合要求的子串,然后批量存入vector:
#include <iostream> #include <vector> #include <string> #include <regex> #include <iterator> int main() { std::string inputLine; std::getline(std::cin, inputLine); std::vector<std::string> inputs; // 定义正则规则:匹配一个或多个字母(大小写)或连字符 std::regex re(R"([a-zA-Z-]+)"); // 用迭代器遍历所有匹配结果 std::sregex_iterator matchIt(inputLine.begin(), inputLine.end(), re); std::sregex_iterator endIt; // 将所有匹配到的子串存入vector for (; matchIt != endIt; ++matchIt) { inputs.push_back(matchIt->str()); } // 测试输出(可按需删除) for (const auto& str : inputs) { std::cout << str << std::endl; } return 0; }
关键细节说明:
- 用原始字符串字面量
R"(...)"定义正则,避免转义字符的麻烦;[a-zA-Z-]+表示匹配一个及以上的字母(大小写)或连字符,完全贴合你的规则。 std::sregex_iterator是专门用来遍历字符串中所有正则匹配结果的工具,能自动跳过所有分隔符,直接定位合法子串。
方案二:手动遍历字符串(适合不想依赖正则的场景)
如果不想用正则库,也可以手动逐个字符判断,构建合法子串:
#include <iostream> #include <vector> #include <string> #include <cctype> int main() { std::string inputLine; std::getline(std::cin, inputLine); std::vector<std::string> inputs; std::string currentSubStr; for (char c : inputLine) { // 判断当前字符是否为字母或连字符 if (std::isalpha(static_cast<unsigned char>(c)) || c == '-') { currentSubStr += c; } else { // 遇到分隔符时,若当前子串非空则存入vector并清空 if (!currentSubStr.empty()) { inputs.push_back(currentSubStr); currentSubStr.clear(); } } } // 处理字符串末尾的合法子串(避免最后一段没被存入) if (!currentSubStr.empty()) { inputs.push_back(currentSubStr); } // 测试输出(可按需删除) for (const auto& str : inputs) { std::cout << str << std::endl; } return 0; }
关键细节说明:
- 用
std::isalpha判断字母时,转成unsigned char是为了避免字符编码异常导致的错误。 - 遍历结束后要额外检查
currentSubStr,防止字符串最后一段合法字符没被存入vector。
测试你给出的示例输入"hello,sir my nameéis ada-m",两种方案都会得到hello、sir、my、name、is、ada-m这些元素,完全符合需求~
内容的提问来源于stack exchange,提问作者KingAzaiez
相关产品推荐
相关产品推荐

