【问题标题】:Parse a string of a peculiar format [duplicate]解析一个特殊格式的字符串[重复]
【发布时间】: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";}

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

  1. 一个'
  2. abcdef
  3. abcde
  4. 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 = 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。

【问题讨论】:

  • 格式似乎很简单,可以手动为其创建基于状态自动机的解析器。
  • 看起来像i=integers=strings:n = string of size na=object 等等。顺便说一句,我不认为正则表达式是为了解析这个。
  • i 可能是条目的索引
  • @biziclop 哦,是的,a:4 将用于大小为 4 的 array,每个 i: 将是此数组中的索引。
  • 原来这是标准的 PHP 序列化格式,因此它是链接问题的副本。感谢@SilentDariusz 指出这一点。

标签: java regex string


【解决方案1】:

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

使用正则表达式很容易导致您不会涵盖此处使用的序列化函数中实现的某些数据格式。

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

【讨论】:

  • 您应该添加更多细节才能成为一个好的答案。
  • 我认为真正的答案在于链接问题。不想复制它,也不想为别人的知识学分。
  • @karthikmanchala 我确信您的正则表达式可以轻松破解。真正的解析器是正确的解决方案。
【解决方案2】:

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

如果你想要一个正则表达式,你可以使用以下:

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

并使用$1提取所需

DEMO

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-11-27
    • 1970-01-01
    • 2017-07-16
    • 2011-04-11
    • 1970-01-01
    • 1970-01-01
    • 2013-04-27
    相关资源
    最近更新 更多