Perl正则表达式数组 - 匹配数组的元素

时间:2017-05-17 05:14:05

标签: arrays regex string perl

我正在尝试匹配并删除名为@array的数组中的元素。要删除的元素必须与存储在名为@del_pattern

的数组中的模式匹配
my @del_pattern = ('input', 'output', 'wire', 'reg', '\b;\b', '\b,\b');

my @array = (['input', 'port_a', ','],
             ['output', '[31:0]', 'port_b,', 'port_c', ',']); 

要从@del_pattern中删除@array中包含的模式,我会遍历@del_pattern中的所有元素,并使用grep将其排除。

## delete the patterns found in @del_pattern array
foreach $item (@del_pattern) {
    foreach $i (@array) {
        @$i = grep(!/$item/, @$i);
    }
}

但是,我无法从','删除@array。如果我在','中使用'\b,\b'而不是@del_pattern,则元素port_b,也会从@array中删除,这不是预期的结果。我只想删除仅包含','的元素。

3 个答案:

答案 0 :(得分:1)

您使用的是正确的正则表达式。我更新了代码并尝试了它并且工作正常。 PFB更新代码:

my @del_pattern = ('input', 'output', 'wire', 'reg', '\b;\b', '^,$');

my @array = (['input', 'port_a', ','],
             ['output', '[31:0]', 'port_b,', 'port_c', ',']); 
## delete the patterns found in @del_pattern array
foreach my $item (@del_pattern) {
    foreach my $i (@array) {
        @$i = grep(!/$item/, @$i);
    }
}

唯一的变化是在Regex' \ b,\ b'到' ^,$'。我没有太多关于\ b的信息,但我建议的正则表达式正在做你想要的。

答案 1 :(得分:1)

你想要

^,\z

下面是对\b完全不匹配的解释。


\b

定义“单词”的边界。等同于

(?<=\w)(?!\w) | (?<!\w)(?=\w)

如此

\b,\b

等同于

(?: (?<=\w)(?!\w) | (?<!\w)(?=\w) ) , (?: (?<=\w)(?!\w) | (?<!\w)(?=\w) )

由于逗号是非文字字符,因此简化为

(?<=\w),(?=\w)

所以

'a,b' =~ /\b,\b/      # Match
','   =~ /\b,\b/      # No match

答案 2 :(得分:0)

这可行,但代码不是很好。 此代码段还会删除&#39;,&#39;

 my $elm = [];

sub extract {
   my $elm = shift;

   foreach my $del (@del_pattern) {
      $elm =~ s/$del//g;
      if ( $elm ) {
         return $elm;
      }
   }
}


foreach my $item (@array) {
    foreach my $i (@$item) {
        my $extract = extract($i);
        if ($extract) {
           push(@$elm, $extract);
        }
    }
}

print Dumper($elm);

为什么你的@array有阵列?为什么不是一个大阵列?