2

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 は次のように述べています。\nbarbaz

量指定子: * ゼロから無制限の回数まで、必要に応じてできるだけ多くの回数を返します。

では、この場合、否定的な後読みが返されるとどうなるでしょうか?

タイトルが示すように、本当の問題は、後読みがその 2 番目のグループを飲み込むのを止めたいということです。残念ながら、これは 1 文字ではありません。これは、例を理解しやすくするためのものです。また、perl では、たとえば「可変長の後読みは正規表現では実装されていません」など、否定的な後読みでできることには多少制限があります。可能であれば、perl 5.8 と互換性のある回答をお願いします。ありがとう

4

2 に答える 2

2

それは実際に最後の位置と一致し、位置が の前で\n、その後$、正規表現を見てください:

(?<!bar)(\s*)$

位置がbar一致しない前

位置$合わせ後、(\s*)$

于 2015-09-08T03:23:40.483 に答える
2
于 2015-09-08T03:23:48.953 に答える