繁体   English   中英

Perl字符串正则表达式

[英]Perl String Regular Expression

我在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

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

我将衷心感谢您的帮助。 我真的很喜欢正则表达式。

谢谢!

不要使用正则表达式来解析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标准-您的代码将意外中断,并且您可能不会意识到。 这可能会引起破坏的骨牌效应,使整个系统或站点崩溃并烧毁。 而更糟糕的是-这崩溃的来源和Burn将在某些脚本尚未触及多年,所以就很难修复被藏起来。

作为专业的系统管理员,这是我的宠儿之一。 请甚至不要去那里。

尽管您的JSON字符串格式略有错误(在数组的最后一个元素之后还有一个逗号,这应该由生成“ JSON”的人来解决),但是尝试使用正则表达式来处理此问题仅意味着您现在有两个问题而不是一。

更具体地说,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;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM