Perl中\z和\Z以及\a和\A之间的区别

7
请问在Perl中,\z\Z以及\a\A有什么区别?请给出一个简单的例子。

不行,因为你没有解释这些字符序列在哪里/如何使用。 - Marc B
@user3597719 RT*M - Biffen
8
你似乎没有尝试过自己解决这个问题。在“perldoc perlre”的断言章节中非常清楚地阐述了这一点。 - Borodin
2个回答

20

\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


6
  • \A 在位置0处匹配零个字符。
  • \z 在字符串结尾处匹配零个字符。
  • \Z 在字符串结尾处和尾随换行符处匹配零个字符。

  • ^没有/m的情况等同于\A
  • ^加上/m匹配位置0和换行符后面的零个字符。
  • $没有/m的情况等同于\Z
  • $加上/m匹配字符串末尾和换行符后面的零个字符。

  • \a 匹配BEL/BELL字符。
    • 在基于ASCII的机器上,它等同于 \x07
    • 在基于EBCDIC的机器上,它等同于 \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中有记录。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接