[英]Split string in two parts using C++ Boost?
我希望能夠將字符串分割成兩個部分, left
和right
,在第一次出現separator
。 例如,使用#
作為分隔符left#right#more
將導致left
和right#more
。
我有一種方法可以做到這一點:
void misc::split(const string &input, string &left, string &right, char separator)
{
int index = input.find(separator);
if (index == string::npos)
{
left = input;
right.erase();
}
else
{
right = input.substr(index + 1);
left = input.substr(0, index);
}
}
現在,我已經開始使用Boost,並且希望將這段冗長的代碼壓縮為更精美的代碼。 我知道boost::split()
,但是在初始示例中這給了我三個部分( left
, right
和more
)。
有什么建議么?
我預測它不會好得多,因為如果具有內在復雜性。
不過,這是一個基於精神的示例:
static void split(const std::string &input, std::string &left, std::string &right, char separator)
{
using namespace boost::spirit::qi;
parse(input.begin(), input.end(), *~char_(separator) >> separator >> *char_, left, right);
}
經過全面測試:
#include <boost/spirit/include/qi.hpp>
struct misc {
static void split(const std::string &input, std::string &left, std::string &right, char separator)
{
using namespace boost::spirit::qi;
parse(input.begin(), input.end(), *~char_(separator) >> separator >> *char_, left, right);
}
};
int main() {
for (std::string s : {
"",
"a",
"a;",
"a;b",
";b",
";",
"a;b;",
";;" })
{
std::string l,r;
misc::split(s,l,r,';');
std::cout << "'" << s << "'\t-> l:'" << l << "'\tr:'" << r << "'\n";
}
}
打印:
'' -> l:'' r:''
'a' -> l:'a' r:''
'a;' -> l:'a' r:''
'a;b' -> l:'a' r:'b'
';b' -> l:'' r:'b'
';' -> l:'' r:''
'a;b;' -> l:'a' r:'b;'
';;' -> l:'' r:';'
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.