我正在尝试找到一种优雅的方法来解析字符串,如:
EVENT_TYPE(param1;param2; ...)
EVENT_TYPE是众多字符串常量之一,每个常量都有零个或多个参数。 到目前为止我认为,鉴于sting“s”包含EVENT_TYPE(param1; param2),我写道:
if (boost::istarts_with(s, "EVENT_TYPE")) {
std::istringstream iss(s);
int param1, param2;
iss >> "EVENT_TYPE(" >> param1 >> ";" >> param2 >> ")";
}
如果给出一个 const字符串& 并告诉他们“跳过这些字符”会很好。嗯,事实并非如此。你怎么会这样呢? : - )
感谢您的建议!
答案 0 :(得分:1)
这看起来很复杂,足以保证“真正的”解析器。由于您已经在使用Boost,请首先尝试:http://boost-spirit.com/home/
答案 1 :(得分:1)
// Beware, brain-compiled code ahead!
class string_const {
public:
string_const(const std::string& str) : str_(str) {}
void read(std::istream& is) const
{
is >> std::ws; // if leading whitespace ok
for(std::string::size_type idx=0; idx<str_.size(); ++idx) {
char ch;
if(!(is >> ch))
return;
if(ch != str_[idx]) {
str.setstate(std::ios:failbit);
return;
}
}
}
private:
std::string str_;
};
inline std::istream& operator>>(std::istream& is, const string_const& str)
{
str.read(is);
return is;
}
像这样使用:
iss >> string_const("EVENT_TYPE(") >> ...;