C++正则表达式无法匹配空格后字符的问题求助
结构化字符串拆分及含空格name值提取问题
问题
需要把类似{[data1]name=NAME1}{[data2]name=NAME2}的字符串拆成两个独立的{[dataX]name=XXX}单元,同时正确提取name=后的完整值——但当name值带空格时(比如{[data1]name=NAME 1}{[data2]name=NAME 2}),当前正则处理只能拿到NAME,空格后面的内容会丢失。
当前代码
std::string stdstrData = "{[data1]name=NAME1}{[data2]name=NAME2}"; std::vector<std::string> commandSplitUnderScore; std::regex re("\\}"); std::sregex_token_iterator iter(stdstrData.begin(), stdstrData.end(), re, -1); std::sregex_token_iterator end; while (iter != end) { if (iter->length()) { commandSplitUnderScore.push_back(*iter); } ++iter; } for (auto& str : commandSplitUnderScore) { std::cout << str << std::endl; }
问题原因
你当前只用}做分隔符拆分,得到的是缺少闭合}的片段(比如{[data1]name=NAME 1);如果后续提取name值时用了匹配非空格字符的正则(比如name=(\S+)),自然会在空格处截断内容。
解决办法
直接用正则匹配完整的单元结构,同时确保name=后的内容能匹配到所有非}的字符(包括空格)。
修正后的代码
#include <iostream> #include <string> #include <vector> #include <regex> int main() { std::string stdstrData = "{[data1]name=NAME 1}{[data2]name=NAME 2}"; std::vector<std::string> splitUnits; // 匹配完整的{[dataX]name=XXX}单元,确保包含所有内容直到闭合} std::regex unitRegex(R"(\{(\[data\d+\]name=[^}]+)\})"); std::sregex_iterator iter(stdstrData.begin(), stdstrData.end(), unitRegex); std::sregex_iterator end; // 收集所有完整单元 while (iter != end) { splitUnits.push_back((*iter)[0]); // (*iter)[0]是整个匹配的单元 ++iter; } // 输出拆分后的单元 std::cout << "拆分后的单元:" << std::endl; for (auto& unit : splitUnits) { std::cout << unit << std::endl; } // 如果需要提取每个单元里的name值 std::regex nameRegex(R"(name=([^}]+))"); std::cout << "\n提取的name值:" << std::endl; for (auto& unit : splitUnits) { std::smatch match; if (std::regex_search(unit, match, nameRegex)) { std::cout << match[1] << std::endl; } } return 0; }
关键说明
[^}]+是核心:匹配任意非}的字符,不管有没有空格,都会一直匹配到单元末尾的},确保拿到完整的name值- 用
std::sregex_iterator直接遍历所有完整单元,比按分隔符拆分更可靠,不会丢失闭合}
内容的提问来源于stack exchange,提问作者Summit
相关产品推荐
相关产品推荐

