- 主题:[求助]求一个判断的算法
一个字符串,可能是一段base64, 也可能是a=b&c=d&e=f这种形式,也可能是一个json,还有可能是其他几种已知格式的类型。
是否有办法只遍历一次(尽可能快地) 就判断出这个字符串是哪种类型?
--
修改:casbupt FROM 118.198.169.*
FROM 118.198.169.*
把所有可能的格式都列出来才好根据各自特征来看怎么判断
【 在 casbupt (想不上班有钱赚) 的大作中提到: 】
: 一个字符串,可能是一段base64, 也可能是a=b&c=d&e=f这种形式,也可能是一个json,还有可能是其他几种已知格式的类型。
: 是否有办法只遍历一次(尽可能快地) 就判断出这个字符串是哪种类型?
--
FROM 120.244.142.*
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.*
应该可以,不过会很累,意义不大。不如开辟个小缓存多次遍历。
【 在 casbupt () 的大作中提到: 】
: 一个字符串,可能是一段base64, 也可能是a=b&c=d&e=f这种形式,也可能是一个json,还有可能是其他几种已知格式的类型。
: 是否有办法只遍历一次(尽可能快地) 就判断出这个字符串是哪种类型?
--
修改:fanci FROM 138.19.103.*
FROM 138.19.103.*
很简单啊,base64 的字符集合是固定的。
json里面必然有 {} 和几乎肯定有 冒号,然后是大概率有逗号,最后是双引号,
方括号。
中间那个必须要有等号。
【 在 casbupt (想不上班有钱赚) 的大作中提到: 】
: 一个字符串,可能是一段base64, 也可能是a=b&c=d&e=f这种形式,也可能是一个json,还有可能是其他几种已知格式的类型。
: 是否有办法只遍历一次(尽可能快地) 就判断出这个字符串是哪种类型?
--
修改:hoodlum FROM 211.95.56.*
FROM 211.95.56.*
【 在 one4all4one 的大作中提到: 】
: if (s.contains('{')) json
: else if (s.contains('&')) a=b&c=d&e=f
: else base64
: ...................
json不一定。
["a","b","c"]
--
修改:ylh1969 FROM 111.193.71.*
FROM 111.193.71.*
那就连带着判断方括号啊,楼主的需求很明确,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.*
【 在 one4all4one 的大作中提到: 】
: 那就连带着判断方括号啊,楼主的需求很明确,base64没有花括号和方括号,三个&连接的也不是base64
: if s.contains("[") or s.contains("{") ot s.contains("\"")
: json
: ...................
base64包含&,我记得好像。
而且你的算法实际扫描2次或3,4次。
--
修改:ylh1969 FROM 111.193.71.*
FROM 111.193.71.*
状态机吧?
【 在 casbupt (想不上班有钱赚) 的大作中提到: 】
: 一个字符串,可能是一段base64, 也可能是a=b&c=d&e=f这种形式,也可能是一个json,还有可能是其他几种已知格式的类型。
: 是否有办法只遍历一次(尽可能快地) 就判断出这个字符串是哪种类型?
--
FROM 114.247.175.*
base64不含&,
用bool做flag来记录是否找到{,[,",&就行了,虽然我上面用的是contains,但是你用循环从头开始,最多扫描整个字符串一次,
如果前面的flag满足条件,直接break输出结果,都不用扫描完
【 在 ylh1969 的大作中提到: 】
: base64包含&,我记得好像。
: 而且你的算法实际扫描2次或3,4次。
--
修改:one4all4one FROM 152.78.0.*
FROM 152.78.0.*