4

您好,我一直在尝试使用 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 提出的,并由彼得谢谢大家解释。

4

3 回答 3

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";
    }
}
于 2009-02-12T15:42:16.157 回答
5

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

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 > >带有boost::escaped_list_separator< char >分隔符对象的类型化对象作为其 TokenizerFunc。

于 2009-02-12T15:33:27.737 回答
0

一个相关但不是答案的问题是,如果用户想在结果中输出双引号,则维基百科中描述的嵌入引号(“”)(如此处)应替换为字符串 of (\\\"),其中\\表示转义char 和\"表示引号。这样,引号将显示在输出结果中。以下代码片段是一个示例。

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';

这是一个典型的输出

于 2017-01-24T13:37:12.923 回答