我想要用regex
来分割std::string
。
我在Stackoverflow上找到了一些解决方案,但大多数是通过单个空格来分割字符串或使用boost等外部库。
我无法使用boost。
我想要通过正则表达式"\\s+"
来分割字符串。
我正在使用这个g++版本g++ (Debian 4.4.5-8) 4.4.5
,而且我无法升级。
#include <regex>
std::regex rgx("\\s+");
std::sregex_token_iterator iter(string_to_split.begin(),
string_to_split.end(),
rgx,
-1);
std::sregex_token_iterator end;
for ( ; iter != end; ++iter)
std::cout << *iter << '\n';
< p > 这里关键是 < code > -1 :当构建迭代器时,迭代器指向匹配之前的文本,每次增加后,迭代器指向先前匹配之后的文本。
< p > 如果您没有 C++11,则可以使用 TR1 或(可能需要略微修改)Boost。
regex_token_iterator<std::string::iterator>
。 sregex_token_iterator
更容易。已修复。谢谢。 - Pete Becker在回答@Pete Becker的基础上,我提供一个可以使用正则表达式分割文本的“resplit”函数示例:
#include <regex>
std::vector<std::string> resplit(const std::string &s, const std::regex &sep_regex = std::regex{"\\s+"}) {
std::sregex_token_iterator iter(s.begin(), s.end(), sep_regex, -1);
std::sregex_token_iterator end;
return {iter, end};
}
这个的工作原理如下:
string s1 = "first second third ";
vector<string> v22 = resplit(s1);
for (const auto & e: v22) {
cout <<"Token:" << e << endl;
}
//Token:first
//Token:second
//Token:third
string s222 = "first|second:third,forth";
vector<string> v222 = resplit(s222, "[|:,]");
for (const auto & e: v222) {
cout <<"Token:" << e << endl;
}
//Token:first
//Token:second
//Token:third
//Token:forth
如果您只想通过多个空格来拆分字符串,则无需使用正则表达式。编写自己的正则表达式库对于如此简单的事情来说过于复杂。
您在评论中提到的答案(Split a string in C++?),可以轻松更改以排除任何空元素(如果有多个空格)。
std::vector<std::string> &split(const std::string &s, char delim,std::vector<std::string> &elems) {
std::stringstream ss(s);
std::string item;
while (std::getline(ss, item, delim)) {
if (item.length() > 0) {
elems.push_back(item);
}
}
return elems;
}
std::vector<std::string> split(const std::string &s, char delim) {
std::vector<std::string> elems;
split(s, delim, elems);
return elems;
}
在将item
推入elems
向量之前检查item.length() > 0
,这样如果您的输入包含多个定界符(例如空格),您就不会再获得额外的元素。
str.split(...)
;) - Lu4string s = "foo bar baz";
regex e("\\s+");
regex_token_iterator<string::iterator> i(s.begin(), s.end(), e, -1);
regex_token_iterator<string::iterator> end;
while (i != end)
cout << " [" << *i++ << "]";
打印[foo] [bar] [baz]
C++03
)拆分std::string
。如果您有一些链接/代码,请粘贴它。:)谢谢! - nothing-special-here