【发布时间】:2015-07-23 05:36:37
【问题描述】:
当我必须在规则中定义减号并且它只是一个减号而不是两个端点之间的字符范围时,我对解析字符串感到非常困惑。
例如,当您编写规则来对字符串进行百分比编码时,您通常会编写
*(bk::char_("a-zA-Z0-9-_.~") | '%' << bk::right_align(2, 0)[bk::upper[bk::hex]]);
这通常表示“字母、大写字母、数字、减号、下划线、点和波浪号”,但第三个减号会创建一个介于 9 和下划线之类的范围,所以你必须把减号放在末尾bk::char_("a-zA-Z0-9_.~-").
它解决了当前的问题,但是当输入是动态的,比如用户输入,而减号只是表示减号时,该怎么办?
如何防止 Spirit 为任何可能的字符赋予特殊含义?
EDIT001:
我求助于@sehe answer
void spirit_direct(std::vector<std::string>& result, const std::string& input, char const* delimiter)
{
result.clear();
using namespace bsq;
if(!parse(input.begin(), input.end(), raw[*(char_ - char_(delimiter))] % char_(delimiter), result))
result.push_back(input);
}
如果您想确保将减号视为减号而不是范围,则可以按以下方式更改代码(根据下面的@sehe 建议)。
void spirit_direct(std::vector<std::string>& result, const std::string&
input, char const* delimiter)
{
result.clear();
bsq::symbols<char, bsq::unused_type> sym_;
std::string separators = delimiter;
for(auto ch : separators)
{
sym_.add(std::string(1, ch));
}
using namespace bsq;
if(!parse(input.begin(), input.end(), raw[*(char_ - sym_)] % sym_, result))
result.push_back(input);
}
看起来很优雅。 如果使用静态常量规则,我想我可以用“\”转义字符,方括号是指需要转义的“特殊”字符之一。为什么?是什么意思 []?是否有任何额外的字符可以转义?
【问题讨论】:
标签: c++ boost boost-spirit-qi