【问题标题】:Perl Array of regular expressions -- matching elements of an arrayPerl 正则表达式数组——匹配数组的元素
【发布时间】:2017-10-16 09:37:05
【问题描述】:

我正在尝试从名为@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', ',']); 

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

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

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

【问题讨论】:

  • 尝试使用 '^\,$' 来删除仅包含 的单词,因为您使用的模式将删除所有包含 , 的单词。
  • 所以如果你在@array 中有input_a 应该被删除吗?换句话说,模式需要匹配还是相等?对于逗号,您说它应该相等——“that contains only ,”(我的重点)。
  • 如果我在@array 中有input_a,它不应该被删除。模式需要匹配
  • 好的——但不是逗号?有了它,只有当它恰好是逗号时才删除元素?如果是这种情况,最有意义的是使该正则表达式/^,$/,因此匹配它意味着它是相等的。
  • 另外,你应该使用qr/.../(不仅仅是单引号)来创建你的正则表达式。

标签: arrays regex string perl


【解决方案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);
    }
}

所做的唯一更改是在正则表达式 '\b,\b' 中更改为 '^,$'。我没有太多关于 \b 的信息,但我建议的正则表达式正在做你想做的事情。

【讨论】:

  • ^,$ 将同时删除 ,,␊^,\z 是正确的解决方案。
【解决方案2】:

你想要

^,\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

【讨论】:

    【解决方案3】:

    这可行,但从代码来看不是很好。 此代码 sn -p 还删除了 ','

     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 有数组?为什么不是一个大数组?

    【讨论】:

    • 它是一个嵌套数组。原始数组包含行列表,其中单行是一个元素。然后用空格作为分隔符分割一行,形成数组中的数组。我的结构是这样的,如果有错误,我会更容易追踪
    猜你喜欢
    • 1970-01-01
    • 2016-12-08
    • 1970-01-01
    • 1970-01-01
    • 2016-01-15
    • 2023-03-08
    • 1970-01-01
    • 1970-01-01
    • 2014-11-02
    相关资源
    最近更新 更多