繁体   English   中英

Perl,在由未知字符分隔的同一行中多次匹配一个模式

[英]Perl, match one pattern multiple times in the same line delimited by unknown characters

我已经能够找到类似但不完全相同的问题。 如何在由未知字符分隔的同一行中多次匹配一个正则表达式模式?

例如,假设我想匹配模式HEY。 我想要认识到以下所有方面:

嘿嘿

HEYxjfkdsjfkajHEY

所以我在那里算了5个HEY。 所以这是我的程序,它适用于除最后一个之外的所有内容:

open ( FH, $ARGV[0]);
while(<FH>)
{
  foreach $w ( split )
  {
      if ($w =~ m/HEY/g)
      {
            $count++;
      }
  }
}

所以我的问题是如何替换foreach循环以便我可以识别由未知配置中的奇怪字符分隔的模式(如上例所示)?

编辑:

感谢迄今为止的出色回应。 我刚才意识到我需要另外一件事,我在下面的评论中提到了这一点。

但有一个问题是:有没有办法保存匹配的条款? 所以在我的情况下,有没有办法引用$ w(比如说正则表达式更复杂,我想将它存储在具有出现次数的哈希值中)

因此,如果我匹配一个真正的正则表达式(比如一系列字母数字字符)并希望将其保存在哈希中。

一种方法是捕获字符串的所有匹配项,看看你得到了多少。 像这样:

open (FH, $ARGV[0]);
while(my $w = <FH>) {
    my @matches = $w =~ m/(HEY)/g;
    my $count = scalar(@matches);
    print "$count\t$w\n";
}

编辑:

就在这里! 只需遍历所有匹配项,并使用捕获变量增加哈希中的计数:

my %hash;
open (FH, $ARGV[0]);
while (my $w = <FH>) {
   foreach ($w =~ /(HEY)/g) {
       $hash{$1}++;
   }
}

问题是你真的不想调用split()。 它将事物分成单词,你会注意到你的最后一行只有一个“单词”(尽管你不会在字典中找到它)。 一个词以白色空间为界,因此只是“除了空白之外的所有东西”。

你真正想要的是继续查看计算每个HEY的每一行,从你每次离开的地方开始。 这需要最后的/ g,但要继续寻找:

while(<>)
{
      while (/HEY/g)
      {
            $count++;
      }
}

print "$count\n";

当然,有不止一种方法可以做到,但这很贴近你的榜样。 其他人也会发布其他精彩的例子。 向他们学习!

上述答案都不适用于我的类似问题。 $ 1似乎没有改变(perl 5.16.3)所以$ hash {$ 1} ++将只计算第一场比赛n次。

要获得每个匹配,foreach需要分配一个局部变量,然后包含匹配变量。 这是一个匹配并打印每个(数字)的脚本。

#!/usr/bin/perl -w                                                                                                                    
use strict;
use warnings FATAL=>'all';

my (%procs);
while (<>) {

    foreach my $proc ($_ =~ m/\((\d+)\)/g) {
        $procs{$proc}++;
    }

}

print join("\n",keys %procs) . "\n";

我这样使用它:

pstree -p | perl extract_numbers.pl | xargs -n 1 echo

(除了该管道中的一些相关过滤器)。 任何模式捕获也应该起作用。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM