- 主题:[求助]求一个判断的算法
if (s.contains('{')) json
else if (s.contains('&')) a=b&c=d&e=f
else base64
json肯定有{和}
base64只有[a-zA-Z0-9]和=,肯定没有&
【 在 casbupt 的大作中提到: 】
: 一个字符串,可能是一段base64, 也可能是a=b&c=d&e=f这种形式,也可能是一个json,还有可能是其他几种已知格式的类型。
: 是否有办法只遍历一次(尽可能快地) 就判断出这个字符串是哪种类型?
--
修改:one4all4one FROM 152.78.0.*
FROM 152.78.0.*
那就连带着判断方括号啊,楼主的需求很明确,base64没有花括号和方括号,三个&连接的也不是base64
if s.contains("[") or s.contains("{") ot s.contains("\"")
json
else if s.contains("&")
a&b&c
else
base64
【 在 ylh1969 的大作中提到: 】
: json不一定。
: ["a","b","c"]
--
FROM 92.40.168.*
base64不含&,
用bool做flag来记录是否找到{,[,",&就行了,虽然我上面用的是contains,但是你用循环从头开始,最多扫描整个字符串一次,
如果前面的flag满足条件,直接break输出结果,都不用扫描完
【 在 ylh1969 的大作中提到: 】
: base64包含&,我记得好像。
: 而且你的算法实际扫描2次或3,4次。
--
修改:one4all4one FROM 152.78.0.*
FROM 152.78.0.*
=不能作为判断2,因为base64的填位字符正好就是=
但是{,[,",&,这些base64是没有的
【 在 hoodlum 的大作中提到: 】
: 很简单啊,base64 的字符集合是固定的。
: json里面必然有 {} 和几乎肯定有 冒号,然后是大概率有逗号,最后是双引号,
: 方括号。
: ...................
--
FROM 152.78.0.*
我写的是伪代码,怎么会需要扫描多次呢?如果是json或者第二种情况,都不需要扫描完整个字符串
// loop
result = "base64"
for c in string:
if c=='{' or c=='[' or c=='\"':
result = "json"
break
else if c=='&':
result = "case 2"
break
【 在 ylh1969 的大作中提到: 】
: base64包含&,我记得好像。
: 而且你的算法实际扫描2次或3,4次。
--
FROM 152.78.0.*
那还要考虑JSON可能含有=,或者base64不含=的时候,分情况反而复杂
【 在 hoodlum 的大作中提到: 】
: 这也简单,在 base64 上面,= 必然位于结尾,而且后面要么是 = 要么是
: 结束符。
: 而 a=b 这个,= 后面必须是普通字符且不能是 = ,这个base64不满足。
: ...................
--
FROM 92.40.169.*
杀鸡焉用牛刀?就我上面那个扫一遍的够用了,然后根据实际情况再调整就行了
【 在 dormouseBHU 的大作中提到: 】
: 统计每个字符的词频,然后knn,支持向量机一类的机器学习算法。 我估计 KNN就能判断的很准。
--
FROM 152.78.0.*