如何在JSON值中获取动态变量?

时间:2018-04-12 04:07:11

标签: regex perl

我需要使用find和替换正则表达式,如下面的

use strict;
no strict 'refs';
use warnings;
use JSON;
use Encode qw( encode decode encode_utf8 decode_utf8);

my $data =  
{
    "find_replace" => [
        {   "find" => "(.+?)&",
            "replace"=> "$1"
        }
    ]
};

my $find_replace_arr = $data->{'find_replace'};
my $string  = "http://www.website.com/test.html&code=236523";

my $find = $find_replace_arr->[0]->{find};
my $replace = $find_replace_arr->[0]->{replace};

$string =~ s/$find/$replace/isge;

print $string;
exit();

在此代码中,我只想从字符串中“http://www.website.com/test.html”。

我无法动态获取替换(键)的值,即$ 1.

您可以运行上述代码。

  

此代码抛出字符串

中未初始化值$ 1的错误使用

1 个答案:

答案 0 :(得分:4)

要考虑的一些事情。首先,正则表达式([^&]+)可能无法提供所需的结果,因为它实际上将捕获并替换为相同的捕获..导致相同的输出字符串(令我感到困惑)。

接下来,必须再次引用替换字符串"$1",并且e修饰符必须加倍。

所以试试这个:

my $data =  
{
    "find_replace" => [
        {   "find" => "^(.+?)&.*",
            "replace"=> '"$1"'
        }
    ]
};

my $find_replace_arr = $data->{'find_replace'};
my $string  = "http://www.website.com/test.html&code=236523";

my $find = $find_replace_arr->[0]->{find};
my $replace = $find_replace_arr->[0]->{replace};

$string =~ s/$find/$replace/isgee;

print $string;
exit();

请注意,新的正则表达式^(.+?)&.*将匹配整个字符串,但捕获(...)将是要替换的结果。