gpt4 book ai didi

c++ - 用于引号和括号的 Boost.Tokenizer

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:33:12 25 4
gpt4 key购买 nike

我想使用 Boost.Tokenize 将字符串拆分为标记。要求引号或括号中的文本是一个完整的标记。更具体地说,我需要像这样拆分一条线

"one (two),three" four (five "six".seven ) eight(nine, ten)

变成像这样的标记

one (two),three
four
(five "six".seven )
eight
(nine, ten)

或者也许

one (two),three
four
(
five "six".seven
)
eight
(
nine, ten
)

我知道the way标记引号中的文本,但我不知道如何同时标记括号中的文本。可能需要实现 TokenizerFunction
如何按照我描述的那样拆分字符串?

最佳答案

TokenizerFunction是一个有两个方法的仿函数,这两个方法都应该很难实现。第一个是 reset , 这意味着重置仿函数可能具有的任何状态,另一个是 operator() ,它需要三个参数。前两个是迭代器,第三个是生成的标记。

下面的算法很简单。首先,我们跳过任何空格。我们期望第一个非空格字符是三种类型之一。如果它是引号或左括号,那么我们将搜索直到找到相应的结束定界符并将找到的内容作为标记返回,注意引号应该被删除,但括号显然要保留。如果第一个字符是其他字符,那么我们将搜索下一个分隔符并将其返回。

template <
typename Iter = std::string::const_iterator,
typename Type = std::string
>
struct QuoteParenTokenizer
{
void reset() { }

bool operator()(Iter& next, Iter end, Type& tok) const
{
while (next != end && *next == ' ')
++next;
if (next == end)
return false; // nothing left to read

switch (*next) {
case '"': {
++next; // skip token start
Item const quote = std::find(next, end, '"');
if (quote == end)
return false; // unterminated token
tok.assign(next, quote);
next = quote;
++next;
break;
}
case '(': {
Iter paren = std::find(next, end, ')');
if (paren == end)
return false; // unterminated token
++paren; // include the parenthesis
tok.assign(next, paren);
next = paren;
break;
}
default: {
Iter const first = next;
while (next != end && *next != ' ' && *next != '"' && *next != '(')
++next;
tok.assign(first, next);
}
}
return true;
}
};

您可以将其实例化为 tokenizer<QuoteParenTokenizer<> > .如果您有不同的迭代器类型或不同的 token 类型,则需要在模板参数中将它们指示给 tokenizer QuoteParenTokenizer .

如果您需要处理转义的定界符,您可以变得更高级。如果您需要带括号的表达式来嵌套,事情就会变得更加棘手。

请注意,截至目前,上述代码尚未经过测试。

关于c++ - 用于引号和括号的 Boost.Tokenizer,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9383749/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com