在这里查看答案时,我测试了另一种方法,该方法涉及使用不同的组标记名称,并在迭代它们时简单地测试哪个是空白的。虽然它可能不是最快的代码,但它是迄今为止最易读的解决方案,这对我的问题更重要。
这是对我有用的代码:
#include <boost/xpressive/xpressive.hpp>
using namespace boost::xpressive;
...
std::vector<std::string> tokens;
std::string input = "here is a \"test string\"";
sregex pattern = sregex::compile("\"(?P<quoted>[^\"]*)\"|(?P<unquoted>\\S+)");
sregex_iterator cur( input.begin(), input.end(), pattern );
sregex_iterator end;
while(cur != end)
{
smatch const &what = *cur;
if(what["quoted"].length() > 0)
{
tokens.push_back(what["quoted"]);
}
else
{
tokens.push_back(what["unquoted"]);
}
cur++;
}