_std::string
_をregex
で分割します。
Stackoverflowでいくつかの解決策を見つけましたが、それらのほとんどは文字列を1つのスペースで分割するか、boostなどの外部ライブラリを使用しています。
ブーストは使えません。
正規表現で文字列を分割したい-_"\\s+"
_。
このg ++バージョンg++ (Debian 4.4.5-8) 4.4.5
を使用していますが、アップグレードできません。
文字列を複数のスペースで分割するだけの場合は、正規表現を使用する必要はありません。独自の正規表現ライブラリを作成することは、単純なものには過剰です。
コメントでリンクした回答 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
を確認することにより、入力に複数の区切り文字(大文字の場合はスペース)が含まれている場合、余分な要素が取得されなくなります
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でも機能します。
@Pete Beckerによる回答を拡張するために、regexpを使用してテキストを分割するために使用できるresplit関数の例を示します。
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]