您好我一直在尝试使用boost库tokenizer类来使用tokenizer。 我在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";
}
}
视觉工作室2005的错误是
错误C2974:'boost :: tokenizer':'TokenizerFunc'的模板参数无效,输入预期
编辑: 这个问题被ferrucio认可,并由彼得谢谢大家解释。
答案 0 :(得分:15)
试试这个:
#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";
}
}
答案 1 :(得分:4)
您似乎错误地声明了您的标记器类型。
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< boost::escaped_list_separator< char > >
分隔符对象作为TokenizerFunc创建boost::escaped_list_separator< char >
类型对象。
答案 2 :(得分:0)
相关的一点尚不是答案,如果用户想在结果中输出双引号,则维基百科中描述的嵌入引用(&#34;&#34;)(like here)应该用(\\\")
字符串替换,其中\\
表示转义字符,\"
表示引号。这样,引号将显示在输出结果中。
以下代码段就是一个示例。
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';