«Новая строка, заканчивающаяся строкой» относится к переводу строки, который является последним символом строки.
Без /m
$
совпадений перед переводом строки в конце строки и в конце строки.
"abc\ndef\n" =~ /^abc$/ # Doesn't match at embedded line feed
"abc\ndef\n" =~ /^abc\n$/ # Doesn't match after embedded line feed
"abc\ndef\n" =~ /^abc\ndef$/ # Matches at string-ending line feed
"abc\ndef\n" =~ /^abc\ndef\n$/ # Matches at end of string
Это эквивалентно \Z
, что эквивалентно (?=\n\z|\z)
.
С /m
$
соответствует перед переводом строки и в конце строки.
"abc\ndef\n" =~ /^abc$/ # Matches at embedded line feed
"abc\ndef\n" =~ /^abc\n$/ # Doesn't match after embedded line feed
"abc\ndef\n" =~ /^abc\ndef$/ # Matches at string-ending line feed
"abc\ndef\n" =~ /^abc\ndef\n$/ # Matches at end of string
Это эквивалентно (?=\n|\z)
.
\z
используется, когда вы хотите точное совпадение.
/xyz\z/ # String ends with "xyz"
$
используется, когда вы хотите игнорировать перевод задней строки.
/xyz$/ # Line ends with "xyz". The string might end with a line feed.
Например,
"jkl" =~ /^jkl$/ # Matches at end of string
"jkl" =~ /^jkl\z/ # Matches at end of string
"jkl\n" =~ /^jkl$/ # Matches at string-ending line feed
"jkl\n" =~ /^jkl\z/ # Doesn't match at string-ending line feed
$
полезно, если вы сопоставляете строки, которые вы еще не набрали.
while (<>) {
next if /^foo$/;
...
}
\z
полезно в остальное время.
Примечание что другие движки регулярных выражений могут вести себя по-другому, даже те, которые Perl -подобны. Например, в JavaScript, $
без /m
совпадает только конец строки.