12

数分前まで、私はPerlがあらゆる種類の$行末に一致すると信じていました。残念ながら、私の仮定は間違っていることが判明しました。

次のスクリプトは、単語endのみを削除し$string3ます。

use warnings;
use strict;

my $string1 = " match to the end" . chr(13);
my $string2 = " match to the end" . chr(13) . chr(10);
my $string3 = " match to the end" .           chr(10);

$string1 =~ s/ end$//;
$string2 =~ s/ end$//;
$string3 =~ s/ end$//;

print "$string1\n";
print "$string2\n";
print "$string3\n";

しかし$、少なくともchr(13).chr(10).

では、アトムは正確には何に (そしてどのような状況で)$一致するのでしょうか?

4

3 に答える 3

12

まず、/m修飾子が有効かどうかによって異なります。

/mアクティブな場合、\n文字の前または文字列の末尾に一致します。に相当し(?=\n|\z)ます。

がない場合、文字列の最後の文字である場合はその文字の前、または文字列の末尾/mに一致します。\nに相当し(?=\n?\z)ます。

一般的な改行とは一致しません。メタ\R文字 (5.10.0 で導入) はそれを行います (ただし、 の文字列の終わりのプロパティはありません$)。一般的な改行に一致する同等のものを取得するために、前の同等性のいずれかで\Rforを置き換えることができます。\n$

\n常にではないことに注意してくださいchr(10)。プラットフォームによって異なります。現在使用されているほとんどのプラットフォームには\n意味chr(10)がありますが、必ずしもそうとは限りません。たとえば、古い Mac では、\nwaschr(13)\rwas chr(10).

于 2012-05-04T09:32:32.270 に答える
5

$/の前ではなく\n/の前の位置のみに一致します。chr(10)\rchr(13)

文字の前に一致すると誤解されることがよくありnewlineます (多くの場合、問題は発生していません) が、厳密には、「改行」文字の前に一致しますが、改行文字の前には一致しません!

正規表現チュートリアル - 文字列または行アンカーの開始と終了を参照してください。

于 2012-05-04T09:30:51.367 に答える
1
/$/
/$/m

と同等です

/(?=\n\z)|\z/
/(?=\n)|\z/

それぞれ。\n既存のすべてのプラットフォームで U+000A (LINE FEED 別名 NEWLINE) に一致します。

于 2012-05-04T16:36:21.573 に答える