理系学生日記

おまえはいつまで学生気分なのか

正規表現にマッチした数を数える

なんか誤読されていた感じなので.

my $str = "ababab";
print "マッチした個数は ", scalar( () = $str =~ /abab/g ), " 個です\n";

これは "abab" という正規表現にマッチした数を出力させていますが,オーバーラップしている "abab" はカウントされません."ababab" の中には "abab" が二つありますが,上記の形ではそれをカウントすることはできません.

マッチした個数は 1 個です


オーバーラップを数えたい場合には,look-ahead assertion を使います.

my $cnt;
$cnt++ while ( $str =~ /(?=abab)/g );
print "マッチした個数は $cnt 個です\n";
マッチした個数は 2 個です

参考図書としてはこのへん.
ISBN:4-87311-037-8:detail