使用 boost::tokenizer 标记包装的字符串
Tokenizing a wrapped string using boost::tokenizer
我正在解析一个自定义元数据文件,其中分隔符是 space ' '
。元数据文件包含应省略 space 分隔符的字符串。所以 "\"This Space\""
是一个标记, "This Space"
应该是两个标记。
有一个类似这样的问题 here,其中包含如何在不使用 boost::tokenizer
的情况下获得结果的答案。这似乎是标记器的默认任务,我认为这应该可以使用 boost::tokenizer
.
我写了一个例子来展示我到目前为止做了什么:
#include <boost/tokenizer.hpp>
#include <vector>
#include <string>
#include <iostream>
using std::string;
using data = std::vector<string>;
data buildExpected()
{
string s[] = {"This", "is one of", "42", "lines" };
return data(s, s + 4);
}
data tokenizeLine(string line)
{
using namespace boost;
data d;
char_separator<char> sep("\" ");
tokenizer<char_separator<char>> tokens(line, sep);
for (string tok : tokens) d.push_back(tok);
return d;
}
void logData(string id, data &d)
{
string line = "(" + id + "):";
bool more = 0;
for (auto s : d)
{
if (more) line += "; ";
more = 1;
line += s;
}
std::cout << line << std::endl;
}
void main()
{
string line = "This \"is one of\" 42 lines";
data expected = buildExpected();
data actual = tokenizeLine(line);
logData("expected", expected);
logData("actual ", actual);
}
这是我系统上的输出:
Boost.Tokenizer 不处理引号。它的功能非常简单 - 只需在每个分隔符出现时拆分为标记。您需要自己处理括号。
我正在解析一个自定义元数据文件,其中分隔符是 space ' '
。元数据文件包含应省略 space 分隔符的字符串。所以 "\"This Space\""
是一个标记, "This Space"
应该是两个标记。
有一个类似这样的问题 here,其中包含如何在不使用 boost::tokenizer
的情况下获得结果的答案。这似乎是标记器的默认任务,我认为这应该可以使用 boost::tokenizer
.
我写了一个例子来展示我到目前为止做了什么:
#include <boost/tokenizer.hpp>
#include <vector>
#include <string>
#include <iostream>
using std::string;
using data = std::vector<string>;
data buildExpected()
{
string s[] = {"This", "is one of", "42", "lines" };
return data(s, s + 4);
}
data tokenizeLine(string line)
{
using namespace boost;
data d;
char_separator<char> sep("\" ");
tokenizer<char_separator<char>> tokens(line, sep);
for (string tok : tokens) d.push_back(tok);
return d;
}
void logData(string id, data &d)
{
string line = "(" + id + "):";
bool more = 0;
for (auto s : d)
{
if (more) line += "; ";
more = 1;
line += s;
}
std::cout << line << std::endl;
}
void main()
{
string line = "This \"is one of\" 42 lines";
data expected = buildExpected();
data actual = tokenizeLine(line);
logData("expected", expected);
logData("actual ", actual);
}
这是我系统上的输出:
Boost.Tokenizer 不处理引号。它的功能非常简单 - 只需在每个分隔符出现时拆分为标记。您需要自己处理括号。