/ ^ $ /匹配哪个非空字符串?

时间:2012-04-18 17:31:33

标签: regex perl

在Perl SO answer中,海报使用此代码来匹配空字符串:

$userword =~ /^$/; #start of string, followed immediately by end of string

brian d foy评论了哪些人:

  

你不能这么说,因为那将匹配一个特定的非空字符串。

问题:哪个非空字符串与此匹配?它只是一个由“\r”组成的字符串吗?

4 个答案:

答案 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