私はPerlで正規表現の_all_の場所を見つける方法はありますか?
sub match_all_positions {
my ($regex, $string) = @_;
my @ret;
while ($string =~ /$regex/g) { push @ret, $-[0] }
return @ret
}
print join ',', match_all_positions('0{3}', '001100010000');
をすれば、私が得ること答えから見ることができ、私はすべてマッチのインデックスを取得するために行う必要がある場合でも、オーバーラップを何
4,8
、など上記の例の8と9の位置に?
私はちょうど私がストリング、または二倍遅い
sub match_all_positions_c {
my ($substr, $string) = @_;
my $re = '^' . $substr;
my @res;
for (0..(length($string) - $length)) {
push @res, $_ if substr($string, $_) =~ /$re/;
}
return @res;
}
print join ',', match_all_positions_c('0{3}', '001100010000');
を一致させることができます
sub match_all_positions_b {
my ($substr, $string) = @_;
return unless index($string, $substr) > 0;
my @res;
my $i = 0;
while ($i <= (length($string) - $length)) {
$i = index($string, $substr, $i);
last if $i < 0;
push @res, $i++;
}
return @res;
}
print join ',', match_all_positions_b('000', '001100010000');
を行うことができます。
すべてが重複しても一致する方法はありますか?それとも、正規表現のマッチを使うのが本質的だから、スピードを落とすべきでしょうか?
いくつかのサンプルデータが有用であろう。オーバーラップするマッチの標準的な「トリック」は、ゼロ幅アサーションです。 – Sobrique
@Sobrique - データについては、コード例を参照してください。 'match_all_positions( '0 {3}'、 '001100010000');は'(4、8、9) 'を返します。 'match_all_positions( '2 {3}'、 '001100010000');'は '()'を返します。 – simone