具有多行匹配的Perl正则表达式问题

时间:2019-07-04 13:42:54

标签: regex perl

我的目标是在多行上提取大字符串的一部分(此字符串为A)。 提取的子字符串(称为B)将添加新的字符串,新的子字符串为C。 最后在A中,我将B替换为C。

这是我的代码,有一些解释...我的子字符串B看起来像这样:

$B = 'define category "Allowed"\n\twww.toto.com\n\twww.tata.com\n\t{...}\nend category "Allowed

这是网站列表。 (实际上,字符串更大-内部有数百个网站) 它以define category "Allowed"开头,以end category "Allowed"结尾。 网站之间用“ \ n \ t”分隔。

我想要所有URL,所以我这样做

if ( $A =~ m/define category "Allowed"\n\t(.*)\nend category "Allowed"/s) {
    my $list = $1 ;

然后我将列表放入阵列

    my @items = split /\n\t/, $list ;

然后,我添加我的新网站“ www.titi.com”

   push @items, "www.titi.com" ;

然后我创建一个新列表

    my $new_list = join "\n\t", @items;

最后,我将旧列表替换为新列表

   $A =~ s/$list/$new_list/;
}

问题在于$ A未被修改(未添加新网站)。

有关信息,我使用数组,因为此函数添加了一个新网站,但是我也需要能够从列表中删除网站,因此(对我而言)使用数组而不是处理字符串更容易(对我而言)直接。

我进行了一些调查,发现当我提取“ $ list”然后验证它是否与$ A匹配时,结果是否定的:

if ( $A =~ m/$list/s ) { print "MATCH\n" ; }

...它从不打印“ MATCH” ...我想念什么?

由于$ list是从模式匹配中提取的,因此它必须与原始字符串匹配,否?

我找到了另一种选择,但是很脏: 我只会将上一个网站替换为上一个网站和这样的新网站:

$A =~ s/$items[$#items-1]/$items[$#items-1]\n\t$items[$#items]/;

这行得通,但是我不满意。

1 个答案:

答案 0 :(得分:1)

  

问题在于$ A未被修改...

我尝试了该代码,并正确地修改了$A。我尝试使用以下$A$B

my $B = 'define category "Allowed"' 
    . "\n\twww.toto.com\n\twww.tata.com\n\t{...}\nend category "
    . '"Allowed"';
my $A = 'xxxxxxxxxxxxx' . $B . 'yyyyyyyyyyyyyyyyyyyyyyyyy'; 

请显示更多代码。