这么说吧,我有99.9%的信心认为“尽可能快”这个是假需求。
换句话说,以下这么实现肯定满足你的需求:
1. 对每种格式的文件写一个流测试器,不叫做:
class StreamChecker {
public:
// add another character from the stream and check if the stream is still
// valid for this type.
virtual bool StillValid(char c) = 0;
// Returns the name of this type, or whatever you want.
virtual string Type() = 0;
virtual ~StreamChecker() = default;
};
这样实现出来会有Base64StreamChecker, PropertyStreamChecker, JSONStreamChecker,
等等。
2. 写一个合并的:
class CombinedStreamChecker : public StreamChecker {
public:
// Some code to add all checkers you need to this class.
bool StillValid(char c) override {
int valid_count = 0;
for (auto it = checkers_.begin(); it != checkers_.end();) {
if ((*it)->StillValid(c)) {
++valid_count;
++it;
} else {
it = checkers_.erase(it);
}
}
return valid_count > 0;
}
bool string Type() override {
if (checkers_.empty()) {
return "Invalid";
} else if (checkers_.front() == checkers_.back()) {
return checkers_.front()->Type();
} else {
return "Multiple Types Possible.";
}
}
private:
std::list<unique_ptr<StreamChecker> checkers_;
};
3. 字符串来了就这个checker一试便知。
【 在 casbupt (想不上班有钱赚) 的大作中提到: 】
: 标 题: [求助]求一个判断的算法
: 发信站: 水木社区 (Mon Mar 9 17:36:06 2020), 站内
:
: 一个字符串,可能是一段base64, 也可能是a=b&c=d&e=f这种形式,也可能是一个json,还有可能是其他几种已知格式的类型。
: 是否有办法只遍历一次(尽可能快地) 就判断出这个字符串是哪种类型?
: --
: ※ 修改:·casbupt 于 Mar 9 17:38:41 2020 修改本文·[FROM: 118.198.169.*]
: ※ 来源:·水木社区
http://www.newsmth.net·[FROM: 118.198.169.*]
--
修改:casbupt FROM 118.198.169.*
FROM 76.126.252.*