perl v5.22.0 の簡単な例を見てみましょう:
my $data = "foobar\n";
$data =~ s/(?<!bar)(\s*)$/qux$1/;
print $data;
それは印刷します:
foobar
qux
しかし、私は変わるとは思っ$data
ていませんでした。以前のバージョンの perl 5.x も試してみましたが、同じ結果でした。
逆に、同じ正規表現を使用したこの文字列が置換を引き起こすことを期待していますが、そうではありません。
my $data = "foobaz\n";
$data =~ s/(?<!bar)(\s*)$/qux$1/;
print $data;
なぜこれが起こるのかわかりません。どちらの場合も、アスタリスクは貪欲であると想定されています。最初の例と2 番目の例と比較して、否定的な後読みグループを作成する$1
と考えました。perl を使用する場合の Regex101 は次のように述べています。\n
bar
baz
量指定子: * ゼロから無制限の回数まで、必要に応じてできるだけ多くの回数を返します。
では、この場合、否定的な後読みが返されるとどうなるでしょうか?
タイトルが示すように、本当の問題は、後読みがその 2 番目のグループを飲み込むのを止めたいということです。残念ながら、これは 1 文字ではありません。これは、例を理解しやすくするためのものです。また、perl では、たとえば「可変長の後読みは正規表現では実装されていません」など、否定的な後読みでできることには多少制限があります。可能であれば、perl 5.8 と互換性のある回答をお願いします。ありがとう