この問題は、実際には貪欲/怠惰とは何の関係もありません(*
またはのような繰り返し演算子にのみ適用されます+
)。
問題は、2 つの空のフィールドが隣り合っていることです: |-|-|
. |
最初のものは一致していますが、オープニングがすでに消費されているため、2 番目のものは失敗しますが、ルールに行頭マーカーがあるため^-|
、それは一致しません。
|
はるかに簡単なアプローチは、入力を分割してから、 a のみで構成されるフィールドを探すことだと思います-
。
my $count = 0;
foreach (split(/\|/,$string)) { if( /^-$/ ) { $count++; } }
Perl は可変長の後読みをサポートしていないため (少なくとも私の知る限り)、これを正規表現で確実に実装する方法はありません。「チート」する 1 つの方法|
は、最初と最後に a を追加することです。そうすれば、後読み/先読みアサーションをうまく使用できます。
$string = "|$string|";
my $count = () = $string=~/(?<=\|)-(?=\|)/g;
(以下の池釜の回答には、文字列を変更せずに非変数ルックアラウンドアサーションを使用する代替ソリューションがあるため、「正規表現でこれを実装する方法がない」と言ったのは間違っていました。池釜への小道具。私はまだ分割を考えています|
ただし、この問題を解決するには最善の方法です。)