0

フォーマットの日付(YYYY_MM_DD)を検証しようとしています。テスト変数を2012_4_123に設定すると、スクリプトの実行後に「有効な形式」が出力されます。正規表現では、日の部分が1桁以上2桁以下であることがチェックされるため、「無効なエラー」メッセージが表示されます。出力メッセージとして「有効な形式」をどのように出力しているかわからない。

my $test="2012_4_123";
if ($test !~ m/^(\d{4})_(\d{1,2})_(\d{1,2})/)
{
  print "invalid format\n";
}
else
{
 print  "valid format\n";
}
4

3 に答える 3

1
-if ($test !~ m/^(\d{4})_(\d{1,2})_(\d{1,2})/)
+if ($test !~ m/^(\d{4})_(\d{1,2})_(\d{1,2})$/)
于 2012-07-30T05:15:15.113 に答える
1

$最後にa がありません。"2012_4_12"文字列の末尾にも一致するように指示しなかったため、文字列に一致しています。あなたの正規表現はこれでなければなりません。

$test !~ m/^(\d{4})_(\d{1,2})_(\d{1,2})$/
于 2012-07-30T05:15:16.527 に答える
1

$ を追加するだけで、日付に 2 桁以上を許可するという最初の問題は解決しますが、より微妙なバグが発生します: 最後に改行があっても日付が検証されるようになりました。これはアプリケーションによっては問題にならない場合もありますが、次の例の正規表現を使用することで回避できます。

use strict;
use warnings;

my @tests = (
    '2012_4_123',
    '2012_11_22',
    "2012_11_22\n",
);

use Data::Dumper;
print Dumper \@tests;

foreach my $test (@tests) {
    if ( $test !~ m/\A(\d{4})_(\d{1,2})_(\d{1,2})\z/smx )
    {
        print "invalid format\n";
    }
    else
    {
        print "valid format\n";
    }
}

注:はPerl のベスト プラクティス/smxで推奨されており、特別な必要がない限り、正規表現を使用して記述していますが、慣れていない場合はつまずく可能性があります。

/s/m複数行の文字列をより簡単に処理できるようになります。/sなぜなら、.は改行に一致し、 と/mを使用^$てそれぞれ行の開始と終了に一致し、 \Aand\zは文字列全体の開始と終了に一致するためです。

/x正規表現内で空白とコメントを許可するだけですが、実際に一致させようとしている場合は空白をエスケープする必要があります。

この場合、\z代わりに$それを使用しているため、の使用に関係なく違いが生じます/smx

また、モジュールを調べて、日付形式の検証だけでなく、日付の検証を実行することも悪い考えではないかもしれません (繰り返しますが、これを何に使用するかによって異なります)。perlmonks に関するこの議論を参照してください。

于 2012-07-30T06:58:57.223 に答える