解析一串特殊格式

时间:2015-05-22 12:50:51

标签: java regex string

我有一个遗留应用程序,它以一种特殊的格式将数据存储在数据库中

例如我有以下字符串

a:4:{i:0;s:4:"a’";i:1;s:6:"abcdef";i:2;s:5:"abcde";i:3;s:3:"xyz";}

表示以下四个单独的字符串:

  1. 一个”
  2. ABCDEF
  3. ABCDE
  4. XYZ
  5. 粗略一瞥显示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 = 4a’";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。

2 个答案:

答案 0 :(得分:2)

您可以使用java implementation for deserializing php serialized objects (by google).

如果您需要正则表达式,可以使用以下内容:

i:\d+;s:\d+:"([^"]*)";

并使用$1

提取所需内容

请参阅DEMO

答案 1 :(得分:2)

这是序列化的PHP数组。所以你需要的只是将它反序列化。

当您不能覆盖在此处使用的序列化功能中实现的某些数据格式时,使用regexp很容易导致这种情况。

认为这个主题有帮助:Serialize PHP => Unserialize JAVA / Serialize for php in string format