1

""私のアプリケーションのデータベースレコードには10桁のIDがあり、null値はまたはで示される場合があります"0000000000"。現在、有効なIDを確認するために次のイディオムを使用しています。

my $is_valid = $id =~ m/[0-9]{10}/ && $id =~ /[1-9]/;

最初の正規表現は全体的な形式をチェックし、2番目の正規表現 "0000000000"は文字列のどこかでnull以外の数字を探すことによって値を除外します。これらの2つの正規表現を1つに組み合わせることができるかどうか興味がありました。

その1つの正規表現はおそらく効率が悪くなりますが、私が言ったように、それが実行可能かどうかだけが気になります。

4

5 に答える 5

5

これには、先​​読みアサーションが必要です(明確にするために正規表現を複数行に分割):

if ($id =~ 
    m/\A      # Anchor the match to the start of the string
    (?!0*\z)  # Assert that it's impossible to match only zeroes until end-of-str
    [0-9]{10} # Match exactly 10 digits
    \z        # Anchor the match to the end of the string
    /x)       # (verbose regex)
    {
    # Successful match
}
于 2012-05-14T10:18:30.567 に答える
2

10桁のIDをどのように照合したのか興味があります

my $is_valid = $id =~ m/[0-9]{11}/ && $id =~ /[1-9]/;

..これは11桁のIDにのみ一致するためです。最初の&&引数がfalseの場合、オペレーターは短絡するため、2番目の引数はチェックされません。

私がすることは、検証を処理するための小さなサブルーチンを書くことです。

sub is_valid_id {
    my $id   = shift;
    return 0 if (length($id) != 10);           # assert length
    return 0 unless $id =~ /^[0-9]+$/;         # assert numeric
    return 0 unless $id =~ /[1-9]/;            # assert at least 1 non-zero digit
    return 1;
}

これは過度に冗長に見えるかもしれませんが、この場合、各要件を明確に述べることは良い考えだと思います。

好奇心に関しては、TimPietzckerが2つを組み合わせる正規表現を見つけたと思います。

于 2012-05-14T11:00:17.223 に答える
1

なぜ正規表現を使用して定数文字列をチェックしたいのですか?代わりにそれらを比較してください:

my $is_valid = $id =~ m/[0-9]{11}/ && $id ne "0000000000";
于 2012-05-14T09:50:20.587 に答える
-1

$ id> 0かどうかを確認するだけではるかに簡単です が、正規表現が必要な場合はこれを試してください

my $is_valid = $id =~ /0*[1-9]+/;

ただし、どちらのバリアントも、$idが正確に11桁であるかどうかをチェックしていません。

于 2012-05-14T10:44:11.660 に答える
-1

/0{0}[1-9][0-9]{10}|0{1}[1-9][0-9]{9}|0{2}[1-9][0-9]{8}|...|0{10}[1-9][0-9]{0}/

于 2012-05-14T09:32:33.093 に答える