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

DVK*_*DVK 8 regex perl

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

$userword =~ /^$/; #start of string, followed immediately by end of string
Run Code Online (Sandbox Code Playgroud)

为了这布赖恩·d FOY评论:

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

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

Sin*_*nür 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;
Run Code Online (Sandbox Code Playgroud)

如果你想测试一个字符串是否是空的,使用/^\z/或者看看$str是零(这是我喜欢的).

输出:

ok 1
not ok 2
not ok 3

  • 如果要使用正则表达式测试空字符串,请使用`\ A`.^并不保证它前面没有任何东西. (4认同)

ike*_*ami 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
Run Code Online (Sandbox Code Playgroud)

请注意,/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
Run Code Online (Sandbox Code Playgroud)

并使用/ 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
Run Code Online (Sandbox Code Playgroud)

\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
Run Code Online (Sandbox Code Playgroud)