提取其模式跨越Perl中的行的数据

时间:2017-12-16 01:16:18

标签: regex perl multiline

我有一个多行字符串,如下所示:

value1: [

    2018
  ],
value2: [              2019
     ],

如果可能有一个可变数量的空格和围绕该数字的换行符,我如何才能获取两个方括号之间的value1的数字?有一个简单的正则表达式,还是我应该删除所有的空格然后搜索?

2 个答案:

答案 0 :(得分:1)

它看起来像一些' pseudo-json'。存在JSON::Relaxed模块,该模块可以解析此类数据。来自文档,

  

可以使用单引号或双引号引用字符串。空少   字符串也被解析为字符串。

use 5.014;
use warnings;
use JSON::Relaxed 'from_rjson';

my $rstr = do { local $/; <DATA> };       # load the json-like data
my $d = from_rjson( '{' . $rstr . '}' );  # make a hash and parse

say $d->{value2}->[0];  # 2019

__DATA__
value1: [

    2018
  ],
value2: [              2019
     ],

当然,示例数据非常小,也许完整集不能用上述模块解析。

答案 1 :(得分:-3)

https://regex101.com/r/n2VLSO/2

/^value\d+[:\w ]*\[\s*?(\d+)\s*?\]/gm

我不确定为什么在没有评论的情况下,这已经获得了如此多的反对票。这很简单,答案不需要是主要或超级解释。如果您认为它不起作用,请自行运行(https://ideone.com/OPV8no):

#!/usr/bin/perl

use 5.014;
use strict;
use warnings;

# Example of string setup
my $str = qq{
value1: [

    2018
  ],
value2: [              2019
     ], 
};

# Iterate over string and store desired values
my $search_values = [1,2];
my $matches = {};
foreach my $number (@$search_values){
  if ($str =~ m/^value${number}[:\w ]*\[\s*?(\d+)\s*?\]/gm){
    $matches->{qq{value$number}} = $1;
  }
}

# Example of result
use Data::Dumper;
say Dumper($matches);

因此,$matches->{'value1'}会产生2018