2009-09-22 49 views
0

我需要解析字符的一个极其复杂的字符串来提取它的一个特定部分,其中包含一个外键,数据库(片段来自一个叫做Interspire邮件营销产品和含有一些奇怪的逻辑来过滤联系人列表)。解析字符的复杂的字符串使用Ruby

有问题的字符串如下(是的,我知道这是非常奇怪这是怎么了系统存储。):

a:2:{s:5:"Lists";a:1:{i:0;s:1:"6";}s:5:"Rules";a:1:{i:0;a:3: 
{s:4:"type";s:5:"group";s:9:"connector";s:3:"and";s:5:"rules";a:1:{i:0;a:3: 
{s:4:"type";s:4:"rule";s:9:"connector";s:3:"and";s:5:"rules";a:2: 
{s:8:"ruleName";s:3:"100";s:12:"ruleOperator";s:7:"isempty";}}}}}} 

我需要的部分是{i:0;s:1:"<here>";}但它可不仅仅是一个单一的更字符。我该如何解析这个怪异的串并提取我需要使用Ruby多少?

+2

如何解析器知道要提取一部分?因为它对我和s有一些价值?因为我是0而s是1?即,你找{I:\ *; S:\ *: “\ *”}其中\ *可以是任何东西?或者你在寻找我:0; s:1?或者是其他东西? – DigitalRoss 2009-09-22 20:15:05

+1

你应该检查更多的样本,并寻找方法来找到“”字符串,适用于所有的人都是如此。 – Inshallah 2009-09-22 20:19:32

回答

3

是由PHP生成此字符串 - 所以,如果你有机会到PHP,最好是用它来分析它,因为它是天然的有:

$str='a:2:{s:5:"Lists";a:1:{i:0;s:1:"6";}s:5:"Rules";a:1:{i:0;a:3:{s:4:"type";s:5:"group";s:9:"connector";s:3:"and";s:5:"rules";a:1:{i:0;a:3:{s:4:"type";s:4:"rule";s:9:"connector";s:3:"and";s:5:"rules";a:2:{s:8:"ruleName";s:3:"100";s:12:"ruleOperator";s:7:"isempty";}}}}}}'; 
$array = unserialize($str); 
return $array['Lists'][0]; 

返回6,这是<here>一部分。

数组是这样的:

array (
    'Lists' => 
    array (
    0 => '6', 
), 
    'Rules' => 
    array (
    0 => 
    array (
     'type' => 'group', 
     'connector' => 'and', 
     'rules' => 
     array (
     0 => 
     array (
      'type' => 'rule', 
      'connector' => 'and', 
      'rules' => 
      array (
      'ruleName' => '100', 
      'ruleOperator' => 'isempty', 
     ), 
     ), 
    ), 
    ), 
), 
) 

您可以使用红宝石“系统”命令调用PHP,甚至把它作为一个Web服务做解析 - 一切都取决于你的情况。

4

您可以使用正则表达式:

s = 'a:2:{s:5:"Lists";a:1:{i:0;s:1:"6";}s:5:"Rules";a:1:{i:0;a:3: 
    {s:4:"type";s:5:"group";s:9:"connector";s:3:"and";s:5:"rules";a:1:{i:0;a:3: 
    {s:4:"type";s:4:"rule";s:9:"connector";s:3:"and";s:5:"rules";a:2: 
    {s:8:"ruleName";s:3:"100";s:12:"ruleOperator";s:7:"isempty";}}}}}}' 
print $1 if s =~ /\{i:0;s:1:\"(\d+)\";\}/ // prints 6