我最近發現在Perl正則運算式(Perl 5.26.1 x86_64 on OpenSuse 15.2)中,字串末端的錨點$有一些意外的行為。
據說,$指的是字串的結尾,而不是像grep(1)中那樣指的是行的結尾。 因此,一個明確的
在一個字串的末尾,應該被明確地匹配。 然而,下面這個(完整的)程式:
my @strings = (
"hello world"。
"hello world
"。
"hello world".
);
my $i = 0;
foreach (@strings) {
$i ;
print "$i: > >$_<<
" if /d$/;
}
產生這樣的輸出:
1: >> hello world<<
2: >>hello world?
<<
即,/d$/不僅匹配了三個字串中的第一個,而且還匹配了帶有尾部換行的第二個。 另一方面,正如預期的那樣,重組函式/d
$/只匹配第二個字串,而/ds$/匹配第二個和第三個。
這里發生了什么?
uj5u.com熱心網友回復:
正如已經說過的,$元字符確實匹配字串的結尾,但允許換行,所以在字串結尾的換行之前也是匹配。 請注意,它也可以在多行字串中的內部換行前匹配,并使用/m global modifier
還有一些方法可以微調具體匹配的內容,使用這些斷言
z只匹配字串的結尾,即使有/m標志,但不在結尾的新行之前
只匹配字串的結尾,即使有/m標志,也要在字串結尾的換行前匹配。所以就像$一樣,除了它永遠不會匹配(在)多行字串內部的新行,即使有/m
這些 "零寬度 "斷言匹配的是一個位置,而不是字符。
uj5u.com熱心網友回復:
perlre宣告為$元字符:
匹配字串的末尾
這意味著d后面緊跟著的是
(換行)將與重碼匹配。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/311347.html
標籤:
