使用Ruby解析复杂的字符串

时间:2009-09-22 20:00:15

标签: ruby string

我需要解析一个非常复杂的字符串来提取它的特定部分,其中包含数据库的外键(该片段来自名为Interspire Email Marketer的产品,并包含一些奇怪的逻辑来过滤联系人列表)。

有问题的字符串如下(是的,我意识到它非常奇怪。这就是系统存储它的方式):

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 个答案:

答案 0 :(得分: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

答案 1 :(得分: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',
          ),
        ),
      ),
    ),
  ),
)

您可以使用'system'命令从ruby调用PHP,或者甚至将其作为Web服务进行解析 - 所有这些都取决于您的情况。