8

Perl SO answerでは、投稿者がこのコードを使用して空の文字列を照合しました。

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

ブライアン・ド・フォイは次のようにコメントしています。

それは特定の空でない文字列に一致するため、実際にはそうは言えません。

質問: これに一致する空でない文字列はどれですか? \r「 」のみからなる文字列ですか?

4

4 に答える 4

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;

文字列が空かどうかをテストしたい場合は、 length ofがゼロ/^\z/かどうかを使用または確認します (これが私の好みです)。$str

出力:

わかりました 1
大丈夫じゃない 2
大丈夫じゃない 3
于 2012-04-18T17:34:41.270 に答える
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

whatとmatchが/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
于 2012-04-18T18:43:03.560 に答える
3

正規表現/^$/は、空でない文字列と一致します"\n"

デフォルトでは、Perl の正規表現マッチングは、文字列に 1 つの「行」のテキストが含まれていると想定します。

^行の先頭に一致します。修飾子がない場合/m、これは文字列の先頭と同じです。

$行の終わり、または最後の改行の前のいずれかに一致します (これが、/^$/空でない string に一致させるもの"\n"です)。

引用perldoc perlre

デフォルトでは、"^" 文字は文字列の先頭のみ、"$" 文字は末尾 (または末尾の改行の前) のみに一致することが保証されており、Perl は文字列が1行。埋め込まれた改行は、"^" または "$" と一致しません。ただし、「^」が文字列内の改行の後に一致し (改行が文字列の最後の文字である場合を除く)、「$」が一致するように、文字列を複数行のバッファーとして扱いたい場合があります。改行の前に一致します。オーバーヘッドが少し増えますが、パターン マッチ演算子で /m 修飾子を使用してこれを行うことができます。

于 2012-04-18T19:02:14.340 に答える
1

脚本:

my $str = "\n";

my $test1 = ($str =~ /^$/)   ? 1 : 0;
my $test2 = ($str =~ /\A\z/) ? 1 : 0;

print "$test1, $test2\n";

出力:

1, 0
于 2012-04-18T19:16:58.947 に答える