2012-03-02 33 views
32

特定の文字列が大きな文字列に表示される回数を最も速くカウントする方法は何ですか?私の最高の推測は、その文字列のすべてのインスタンスを何も置き換えずに、長さの差を計算し、部分文字列の長さで除算することですが、それはむしろ遅いと思われ、大量のデータを分析する必要があります。別の文字列(Perl)内の文字列の出現回数をカウントする

+0

が、それは1999年からだが...これをチェックアウトする場合がありますが、そしてこの種のものを行うための最も可能性の高い他の方法があります効率的に:http://www.perlmonks.org/?node=How%20can%20I%20count%20the%20number%20of%20occurrences%20of%20a%20substring%20within%20a%20string%3F – summea

+7

'perldoc -q count ' – toolic

+2

これらは重なり合うことができますか? – tchrist

答えて

57

文字列をキャプチャして数えます。それは()でキャプチャにリストコンテキストを適用することによって行うことができる。

my $x = "foo"; 
my $y = "foo foo foo bar"; 
my $c =() = $y =~ /$x/g; # $c is now 3 

あなたはまた、アレイにキャプチャし、配列を数えることができます。同じ原理、異なる技術:

my @c = $y =~ /$x/g; 
my $count = @c; 
+0

ありがとう! 2番目の解決策によく似ています。 – ronash

+2

@ronashそれは同じ解決策です。 1つは一時変数を使用し、もう1つは使用しません。 'my $ count = @c = $ y =〜/ $ x/g'を実行することもできますが、単に' @c'を無視して '()'を使うだけで済みます。あなたが実際の試合を気にしないなら、どれが最高です。 – TLP

+2

'$ x'が正規表現として解釈されるので、' $ x'にある正規表現文字が含まれていると、これは動作しません。これを修正するために '\ Q'を追加してください。 '/ \ Q $ x/g'となります。詳細は 'quotemeta'を参照してください。 – tuomassalo

8

グローバル正規表現を使用できます。次のようなものがあります。

my @matches = $bigstring =~ /($littlestring)/g; 
my $count = @matches; 
+0

これは最も簡単な解決策のようですが、速いものがない限り、私はそれを使用すると思いますか?ありがとう! – ronash

+0

私は正規表現の速度についてはわかりませんが、マッチング操作を使うだけで代用するよりも速いと確信しています。そして、私は正規表現とは関係のない解決策は考えられません(それ以外の場合は非常に興味深いでしょう)。 – MattLBeck

14
my $string = "aaaabbabbba"; 
my @count = ($string =~ /a/g); 
print @count . "\n"; 

または

my $count = ($string =~ s/a/a/g); 
+0

ありがとう!複数の手紙が求められている場合は、そのことができますか? – ronash

+1

えええええええええええええええと、それは正規表現です。 –

+0

2番目の解決策では、tr/a/a/gは文字をそれ自身で置き換え、trよりも速いので、より良い解決策にはなりませんか? – nerdbeere

4

あなたが繰り返しループ内でINDEX関数を呼び出し、それがでサブストリングのインデックスを返されたすべての回を数えることができるだけで、完全を期すために文字列、および開始位置を変更します。それは正規表現の使用を避け、私のテストでは正規表現の解決法より少し速いです。

私はここからそれを行うためのサブ適応してきました:http://www.misc-perl-info.com/perl-index.html

sub occurrences { 

    my($x, $y) = @_; 

    my $pos = 0; 
    my $matches = 0; 

    while (1) { 
     $pos = index($y, $x, $pos); 
     last if($pos < 0); 
     $matches++; 
     $pos++; 
    } 

    return $matches; 
} 
関連する問題