使用具有不同参数的 Boost Tokenizer escaped_list_separator

Posted

技术标签:

【中文标题】使用具有不同参数的 Boost Tokenizer escaped_list_separator【英文标题】:Using Boost Tokenizer escaped_list_separator with different parameters 【发布时间】:2009-02-12 14:44:53 【问题描述】:

您好,我一直在尝试使用 boost 库标记器类使标记器工作。 我在 boost 文档中找到了本教程:

http://www.boost.org/doc/libs/1 _36 _0/libs/tokenizer/escaped _list _separator.htm

问题是我无法将参数转义为 _list _separator("","","");

但如果我修改 boost/tokenizer.hpp 文件,它就可以工作。 但这不是,理想的解决方案是想知道我是否缺少任何东西来将不同的参数放入转义的_list _separator。

我想用 " 和 ' 将其拆分为空格以进行转义,并且在引用的字符串中没有转义字符。

这用于游戏控制台系统中的参数解析系统。


include <iostream>
include <boost/tokenizer.hpp>
include <string>

int main() using namespace std; using namespace boost; string s = "exec script1 \"script argument number one\""; string separator1("");//dont let quoted arguments escape themselves string separator2(" ");//split on spaces string separator3("\"\'");//let it have quoted arguments tokenizer<escaped_list_separator<char>(separator1,separator2,separator3)> tok(s); for(tokenizer<escaped_list_separator<char>(separator1,separator2,separator3)>::iterator beg=tok.begin(); beg!=tok.end();++beg) cout << *beg << "\n";

Visual Studio 2005 的错误是 错误 C2974:'boost::tokenizer':'TokenizerFunc' 的模板参数无效,应输入类型

编辑: ferrucio 提出了这个问题,peterThank 的大家解释了这个问题。

【问题讨论】:

与其编辑以表明您喜欢哪个答案,请将其作为您接受的答案(使用您喜欢的答案左侧的复选标记按钮)。 【参考方案1】:

试试这个:

#include <iostream>
#include <boost/tokenizer.hpp>
#include <string>

int main()

    using namespace std;
    using namespace boost;
    string s = "exec script1 \"script argument number one\"";
    string separator1("");//dont let quoted arguments escape themselves
    string separator2(" ");//split on spaces
    string separator3("\"\'");//let it have quoted arguments

    escaped_list_separator<char> els(separator1,separator2,separator3);
    tokenizer<escaped_list_separator<char>> tok(s, els);

    for(tokenizer<escaped_list_separator<char>>::iterator beg=tok.begin(); beg!=tok.end();++beg)
    
        cout << *beg << "\n";
    

【讨论】:

谢谢,这确实有效,我知道这是一件小事:P。 可以在输出中保留",例如exec | script1 | "script argument number one" ? @Ferruccio 没有separator1("\\") 有充分的理由吗?这将允许人们在字符串中转义引号字符。 @mgd - 不,没有。我的回答只是解决了编译错误的原因(错位的&gt;)。我把其他所有东西都原样保留了。【参考方案2】:

您似乎错误地声明了标记器类型。

typedef boost::tokenizer< boost::escaped_list_separator<char> > Tokenizer;
boost::escaped_list_separator<char> Separator( '\\', ' ', '\"' );
Tokenizer tok( s, Separator );

for( Tokenizer::iterator iter = tok.begin(); iter != tok.end(); ++iter )
 cout << *iter << "\n"; 

您想创建一个 boost::tokenizer&lt; boost::escaped_list_separator&lt; char &gt; &gt; 类型的对象,并将 boost::escaped_list_separator&lt; char &gt; 分隔符对象作为其 TokenizerFunc。

【讨论】:

那些应该是你的构造函数中的单引号 - 双引号是用于 char*,而不是 char。【参考方案3】:

一个相关但不是答案的观点是,如果用户想要在结果中输出双引号,则*** (like here) 中描述的嵌入引号 ("") 应替换为 @ 字符串987654323@,其中\\ 表示转义字符,\" 表示引号。这样,引号将显示在输出结果中。 下面的代码 sn -p 就是一个例子。

typedef boost::escaped_list_separator<char> std_token;
typedef boost::tokenizer<boost::escaped_list_separator<char>> tokenizer;

std_token a_token( "\\", ",", "\"" );
std::string s = "\"Boost,\\\" C++ Libraries\" ";
tokenizer tok s, a_token ;
for ( const auto &t : tok )
    std::cout << t << '\n';

This is a typical output for this

【讨论】:

以上是关于使用具有不同参数的 Boost Tokenizer escaped_list_separator的主要内容,如果未能解决你的问题,请参考以下文章

Boost::tokenizer 逗号分隔 (c++)

如何使用 boost::tokenizer 作为 C++ 类成员?

boost::tokenizer 考虑分隔符之间没有标记

Boost.Tokenizer 用于引号和括号

字符串迭代器不兼容 boost::tokenizer

Qt 等效于 boost tokenizer 表达式/构造