在Perl SO answer中,海报使用此代码来匹配空字符串:
$userword =~ /^$/; #start of string, followed immediately by end of string
brian d foy评论了哪些人:
你不能这么说,因为那将匹配一个特定的非空字符串。
问题:哪个非空字符串与此匹配?它只是一个由“\r
”组成的字符串吗?
答案 0 :(得分:9)
use strict;
use warnings;
use Test::More;
ok("\n" =~ /^$/);
ok("\n" =~ /^\z/);
ok("\n" =~ /^\A\z/); # Better as per brian d. foy's suggestion
done_testing;
如果您想测试字符串是否为空,请使用/^\z/
或查看$str
的{{3}}是否为零(这是我更喜欢的)。
输出:
ok 1 not ok 2 not ok 3
答案 1 :(得分:7)
让我们查看文档,为什么不呢?引用perlre,
$
:匹配行尾(或结尾处的换行符)
鉴于
\z
:仅在字符串末尾匹配
这意味着/^$/
相当于/^\n?\z/
。
$ perl -E'$_ = ""; say /^$/ ||0, /^\n?\z/ ||0, /^\z/ ||0;'
111
$ perl -E'$_ = "\n"; say /^$/ ||0, /^\n?\z/ ||0, /^\z/ ||0;'
110
请注意,/m
会更改^
和$
匹配的内容。在/m
下,^
匹配任何“行”的开头,$
匹配任何换行符之前和字符串末尾。
$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /^/g'
matched at 0
$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /$/g'
matched at 7
matched at 8
使用/ m:
$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /^/mg'
matched at 0
matched at 4 <-- new
$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /$/mg'
matched at 3 <-- new
matched at 7
matched at 8
\A
,\Z
和\z
不受/m
的影响:
$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /\A/g'
matched at 0
$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /\z/g'
matched at 8
$ perl -E'$_ = "abc\ndef\n"; say "matched at $-[0]" while /\Z/g'
matched at 7
matched at 8
答案 2 :(得分:3)
正则表达式/^$/
匹配非空字符串"\n"
。
默认情况下,Perl正则表达式匹配假定该字符串包含单个“行”文本。
^
匹配行的开头;在没有/m
修饰符的情况下,这与字符串的开头相同。
$
匹配行的结尾,或者结尾处的换行符(这是使/^$/
与非空字符串"\n"
匹配的原因)。
引用perldoc perlre
:
默认情况下,“^”字符保证仅匹配 字符串的开头,“$”字符只有结尾(或之前) 最后的换行符),Perl对它做了一些优化 假设字符串只包含一行。嵌入式换行 不会与“^”或“$”匹配。但是,你可能希望对待一个 string作为多行缓冲区,以便“^”在任何之后匹配 字符串中的换行符(换行符是最后一个字符除外) 在字符串中),“$”将在任何换行符之前匹配。以牺牲为代价 更多的开销,您可以通过使用/ m修饰符来完成此操作 模式匹配运算符。
答案 3 :(得分:1)
<强> 脚本: 强>
my $str = "\n";
my $test1 = ($str =~ /^$/) ? 1 : 0;
my $test2 = ($str =~ /\A\z/) ? 1 : 0;
print "$test1, $test2\n";
<强> 输出: 强>
1, 0