使用perl中的正则表达式从内容中提取多个值

时间:2014-06-19 16:26:01

标签: perl regex-negation

我的内容如下:

"emailAddress":"akashu87@gmail.com","UserName":"Akash Udupa","active":true,"emailAddress":"coolrohit@rediffmail.com","UserName":"Rohit Hegde","active":true,"emailAddress":"manohar_k@rediffmail.com","UserName":"Manohar Karnam","active":true,"emailAddress":"satishgk@hotmail.com","UserName":"Satish GK","active":true

我想通过PERL仅在CSV文件中显示UserName的值,如下所示:

Akash Udupa
Rohit Hegde
Manohar Karnam
Satish GK

我相信你们会问我尝试了什么。问题是我对PERL很新。那么任何人都可以用perl代码帮助我吗?请。

提前致谢。

1 个答案:

答案 0 :(得分:2)

有两种方法可以做到这一点;正确的方式,以及脆弱的方式。由于您的JSON的括号和括号被剥离,您已经开始走向脆弱的道路:

my $string = q{"emailAddress":"akashu87@gmail.com","UserName":"Akash Udupa","active":true,"emailAddress":"coolrohit@rediffmail.com","UserName":"Rohit Hegde","active":true,"emailAddress":"manohar_k@rediffmail.com","UserName":"Manohar Karnam","active":true,"emailAddress":"satishgk@hotmail.com","UserName":"Satish GK","active":true};

while ( $string =~ m/"UserName"\s*:\s*"([^"]+)"/g ) {
  print "$1\n";
}

这将锚定到"UserName"标记,并允许标记及其值之间的空格(但不要求它)。然后它会查找双引号,并捕获所有内容,直到下一个引用$1

Perl的正则表达式的简要介绍包含在Perl附带的perlrequick中。我的正则表达式解决方案没有使用该文档中未解释的任何构造。事实上,perlintro应该被认为是Perl用户需要阅读的,它提供了足以完成此任务的信息。

因为剥离JSON的逻辑可能已经破坏了某些东西,并且因为JSON可能会向你抛出一些我们的一次性正则表达式无法处理的东西,所以恢复原始未掺杂的JSON是明智的,并使用适当的解析器解析它,如下所示:

use JSON;

my $json = <<'EOJSON';
[
    {
        "emailAddress": "akashu87@gmail.com",
        "UserName": "AkashUdupa",
        "active": true
    },
    {
        "emailAddress": "coolrohit@rediffmail.com",
        "UserName": "RohitHegde",
        "active": true
    },
    {
        "emailAddress": "manohar_k@rediffmail.com",
        "UserName": "ManoharKarnam",
        "active": true
    },
    {
        "emailAddress": "satishgk@hotmail.com",
        "UserName": "SatishGK",
        "active": true
    }
]
EOJSON

print "$_->{UserName}\n" for @{decode_json($json)}

如果JSON模块对你来说太重了,请查看JSON::Tiny,这是最小的,经过良好测试且没有依赖性。

正则表达式和解析器方法都可以使用原始JSON,因此您可以通过删除从原始JSON中删除括号和大括号的部分来简化您的代码。完成后,JSON解析器解决方案可以是一行代码。幸运的是,删除代码可以在不删除功能的情况下使代码更加健壮。