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

Regex 在Perl中,在由未知字符分隔的同一行中多次匹配一个模式,regex,perl,Regex,Perl,我已经找到了与这个问题相似但不完全相同的问题。如何在由未知字符分隔的同一行中多次匹配一个正则表达式模式 例如,假设我想匹配模式嘿。我想了解以下所有方面: 哎 嘿嘿 HeyxJfkDsJfkayHey 所以我数了5个海斯。这是我的程序,它适用于除最后一个以外的所有项目: open ( FH, $ARGV[0]); while(<FH>) { foreach $w ( split ) { if ($w =~ m/HEY/g) { $

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

例如,假设我想匹配模式嘿。我想了解以下所有方面:

嘿嘿

HeyxJfkDsJfkayHey

所以我数了5个海斯。这是我的程序,它适用于除最后一个以外的所有项目:

open ( FH, $ARGV[0]);
while(<FH>)
{
  foreach $w ( split )
  {
      if ($w =~ m/HEY/g)
      {
            $count++;
      }
  }
}
open(FH,$ARGV[0]);
while()
{
每小时$w(分割)
{
如果($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";
}
open(FH,$ARGV[0]);
而(我的$w=){
我的@matches=$w=~m/(嘿)/g;
我的$count=标量(@matches);
打印“$count\t$w\n”;
}
编辑:

是的,有!只需循环所有匹配项,并使用捕获变量增加散列中的计数:

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

问题是您确实不想调用split()。它将事物拆分为单词,您会注意到最后一行只有一个“单词”(尽管您在字典中找不到)。单词以空格为界,因此就是“除空格外的所有内容”

你真正想做的是继续看每一行,从你每次停下来的地方开始。需要在末尾添加/g,但要继续查找:

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

print "$count\n";
while()
{
while(/HEY/g)
{
$count++;
}
}
打印“$count\n”;

当然,有不止一种方法可以做到这一点,但这与您的示例非常接近。其他人也会发布其他精彩的例子。向他们学习

以上的答案都不能解决我的类似问题$1似乎没有改变(Perl5.16.3),所以$hash{$1}++将只对第一个匹配进行n次计数

为了获得每个匹配项,foreach需要分配一个局部变量,然后该局部变量将包含匹配变量。下面是一个小脚本,它将匹配并打印(number)的每个匹配项


(管道中的一些相关过滤器除外)。任何模式捕获都应该有效。

嘿,这非常好!我还没有实现它,但它似乎应该可以工作。但有一个问题:有没有办法保存匹配的术语?就像我的例子一样,有没有办法引用$w(比如说如果正则表达式更复杂,我想把它存储在一个包含出现次数的散列中)嘿,谢谢你的帮助。事实上,我不得不通过两种方式修改你的东西:首先,我一生都无法让你的解决方案在第一部分起作用,所以我使用了韦斯的方法(两个while循环)。另外,我只想指出,带有一组组的正则表达式需要()覆盖整个正则表达式,这样就不会得到一个只包含所需总数片段的散列。谢谢你!处理多个分组时,您的朋友是使用问号冒号修改的非捕获组
(?:)
#!/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