【发布时间】:2015-05-22 12:50:50
【问题描述】:
我有一个遗留应用程序,它以一种特殊的格式将数据存储在数据库中
例如我有以下字符串
a:4:{i:0;s:4:"a’";i:1;s:6:"abcdef";i:2;s:5:"abcde";i:3;s:3:"xyz";}
表示以下四个单独的字符串:
- 一个'
- abcdef
- abcde
- xyz
粗略一看,s 后面的参数是对应字符串的长度。然而,这不是在第一个字符串的情况下,s 之后的预期参数应该是 2,而是 4。
到目前为止,我正在通过以下方法解析这个字符串:
首先通过正则表达式获取i:0;s:4:"a’";i:1;s:6:"abcdef";i:2;s:5:"abcde";i:3;s:3:"xyz";
之后通过正则表达式^i:\d+;s:(\d+):"(.+)$ 获取len = 4 和a’";i:1;s:6:"abcdef";i:2;s:5:"abcde";i:3;s:3:"xyz"; 获取第一个选项,获取前4 个字符(这在此处不起作用,因为len 应该是2),然后获取i:1;s:6:"abcdef";i:2;s:5:"abcde";i:3;s:3:"xyz"; 并继续迭代.
我最初也曾尝试通过正则表达式 i:\d*;s:\d*:"([^;]*)"; 一次解析所有内容,但如果字符串包含这种模式,这将不起作用(s 之后的参数应该是执行此操作的明确方法)。
我还检查了如果字符串是a’Δ,那么参数变为6。
您建议我如何处理此类字符串(带有特殊字符),您能告诉我这种格式是什么以及如何解析它吗?
PS:我用的是java。
【问题讨论】:
-
格式似乎很简单,可以手动为其创建基于状态自动机的解析器。
-
看起来像
i=integer、s=string、s:n = string of size n、a=object等等。顺便说一句,我不认为正则表达式是为了解析这个。 -
i可能是条目的索引 -
@biziclop 哦,是的,
a:4将用于大小为 4 的array,每个i:将是此数组中的索引。 -
原来这是标准的 PHP 序列化格式,因此它是链接问题的副本。感谢@SilentDariusz 指出这一点。