簡體   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