请问在Perl中,
\z
和\Z
以及\a
和\A
有什么区别?请给出一个简单的例子。\z
只匹配字符串的结尾。
\Z
也匹配字符串的结尾,但是如果字符串以换行符结尾,则\Z
也会在换行符之前进行匹配。
因此,例如以下五种情况是正确的:
'foo' =~ m/foo\z/
'foo' =~ m/foo\Z/
"foo\n" =~ m/foo\Z/
"foo\n" =~ m/foo\n\z/
"foo\n" =~ m/foo\n\Z/
而这个则是错误的:
"foo\n" =~ m/foo\z/
两者与$
的不同之处在于它们不受/m
“多行”标志的影响,该标志允许$
匹配任何行的结尾。
\a
表示警报(响铃)字符;在正则表达式中它没有任何其他特殊含义。
\A
仅匹配字符串的开头。与^
不同,像\z
和\Z
,它不受/m
“多行”标志的影响。
所有这些都在Perl正则表达式手册页面perlre
中有详细说明:http://perldoc.perl.org/perlre.html。
\A
在位置0处匹配零个字符。\z
在字符串结尾处匹配零个字符。\Z
在字符串结尾处和尾随换行符处匹配零个字符。^
没有/m
的情况等同于\A
。^
加上/m
匹配位置0和换行符后面的零个字符。$
没有/m
的情况等同于\Z
。$
加上/m
匹配字符串末尾和换行符后面的零个字符。\a
匹配BEL/BELL字符。
\x07
。\x2F
。以下是相关正则表达式模式匹配的位置(␊
表示换行符):
\A \A is not affected by /m
^ ^ without /m ≡ \A
^/m ^/m ^/m ^ with /m ≡ \A|(?<=\n)
| | |
0123456789012
| | |
v v v
abc␊def␊ghi␊
^ ^ ^^
| | ||
0123456789012
| | ||___
| | | |
$/m $/m $/m $/m $ with /m ≡ \z|(?=\n)
$ $ $ without /m ≡ \z|(?=\n\z)
\Z \Z \Z is not affected by /m ≡ \z|(?=\n\z)
\z \z is not affected by /m
这在perlre中有记录。
perldoc perlre
”的断言章节中非常清楚地阐述了这一点。 - Borodin