[英]C++ - Split string by regex
我想通過regex
拆分std::string
。
我在 Stackoverflow 上找到了一些解決方案,但其中大多數是按單個空格拆分字符串或使用 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';
-1
是這里的關鍵:當構建迭代器時,迭代器指向匹配之前的文本,每次遞增后,迭代器指向前一個匹配之后的文本。
如果你沒有 C++11,同樣的事情應該適用於 TR1 或(可能稍作修改)與 Boost。
如果您只想按多個空格拆分字符串,則不需要使用正則表達式。 編寫自己的正則表達式庫對於這么簡單的事情來說太過分了。
您在評論中鏈接的答案, 在 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
,如果您的輸入包含多個分隔符(在您的情況下為空格),您將不再獲得額外的元素
為了擴展@Pete Becker 的答案,我提供了一個 resplit 函數示例,該函數可用於使用正則表達式拆分文本:
#include <regex>
std::vector<std::string>
resplit(const std::string & s, std::string rgx_str = "\\s+") {
std::vector<std::string> elems;
std::regex rgx (rgx_str);
std::sregex_token_iterator iter(s.begin(), s.end(), rgx, -1);
std::sregex_token_iterator end;
while (iter != end) {
//std::cout << "S43:" << *iter << std::endl;
elems.push_back(*iter);
++iter;
}
return elems;
}
其工作原理如下:
string s1 = "first second third ";
vector<string> v22 = my::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 = my::resplit(s222, "[|:,]");
for (const auto & e: v222) {
cout <<"Token:" << e << endl;
}
//Token:first
//Token:second
//Token:third
//Token:forth
string 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]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.