2009-09-22 83 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