Perl String正则表达式

时间:2014-12-23 11:09:01

标签: regex perl

我在Perl正则表达式中需要一些帮助。 我有这个字符串:

{
    "ITEM":[
        {
            "-itemID": "1000000" ,
            "-itemName": "DisneyJuniorLA" ,
            "-thumbUrl": "" ,
            "-packageID": "1" ,
            "-itemPrice": "0" ,
            "-isLock": "true" 
        },
        {
            "-itemID": "1000001" ,
            "-itemName": "31 minutos" ,
            "-thumbUrl": "" ,
            "-packageID": "1" ,
            "-itemPrice": "0" ,
            "-isLock": "true" 
        },
        {
            "-itemID": "1000002" ,
            "-itemName": "Plaza Sésamo" ,
            "-thumbUrl": "" ,
            "-packageID": "1" ,
            "-itemPrice": "0" ,
            "-isLock": "true" 
        },
    ]
}

字符串位于变量中:$jsonString

我有另一个变量:$itemName

我想只保留$jsonString itemName之上的itemId值(其中itemName等于$itemName

我真的很感谢你的帮助。我在正则表达式中非常业余。

谢谢!

2 个答案:

答案 0 :(得分:1)

不要使用正则表达式来解析JSON。使用JSON

基本上:

use strict;
use warnings;
use Data::Dumper;
use JSON;

my $json_string;
{
    open( my $json_in, "<", 'test.json' );
    local $/;
    $json_string = <$json_in>;
}

my $json = decode_json ( $json_string );

print Dumper \$json;

foreach my $item ( @{  $json -> {'ITEM'} } ) {
     print $item -> {'-itemID'},"\n";
     print $item -> {'-itemName'},"\n";
}

但你必须先修好你的json。 (有一个尾随的逗号不应该存在。)

JSON是一种已定义的数据传输结构。虽然你可以技术上将其视为“纯文本”并从文本中提取内容,但这绝对是错误的做事方式。

它可能会在很长一段时间内正常工作,但如果您的源程序稍微改变 - 并且更改其输出,同时仍然坚持JSON标准 - 您的代码将意外中断,您可能没有意识到。这可能会导致破坏的多米诺骨牌效应,使整个系统或网站崩溃和烧毁。更糟糕的是 - 此崩溃和刻录的将被隐藏在一些多年未触及的脚本中,因此很难修复。

这是我作为专业系统管理员的烦恼之一。请不要去那里。

答案 1 :(得分:1)

尽管您的JSON字符串格式错误(在数组中的最后一个元素之后还有一个额外的逗号,应该由生成“JSON”的人修复),尝试使用regexp来处理这个只是意味着您现在有两个问题而不是一个。

更具体地说,JSON中的对象是明确的无序组键/值对。完全可能的是,改变JSON的任何内容都可以被重写,使得JSON在语义上相同但序列化不同,使任何依赖于当前结构脆弱错误的东西容易发生

相反,使用适当的JSON解码器,然后直接遍历生成的对象层次结构以找到所需的元素:

use JSON;
use utf8;

# decode the JSON
my $obj = decode_json($jsonString);

# get the ITEM array
my $itemRef = $obj->{ITEM};

# find all elements matching the item name
my @match = grep { $_->{'-itemName'} eq $itemName } @{$itemRef};

# extract the item ID
if (@match) {
    my $itemID = $match[0]->{'-itemID'};
    print $itemID;
}