1

32 ビット整数以外のものに一致する正規表現を考え出そうとしています。私の最終的な目標は、次の形式ではない行を一致させることです

Integer\tInteger\tInteger\tInteger\tInteger\tInteger\tInteger

(7 つの 32 ビット整数と各整数の間に 1 つのタブ)

これまでのところ、私はこれを思いついた

#!/usr/bin/perl -w
use strict;
while ( my $line = <> ) {

    if ( $line =~ /^(429496729[0-6]|42949672[0-8]\d|4294967[01]\d{2}|429496[0-6]\d{3}|42949[0-5]\d{4}|4294[0-8]\d{5}|429[0-3]\d{6}|42[0-8]\d{7}|4[01]\d{8}|[1-3]\d{9}|[1-9]\d{8}|[1-9]\d{7}|[1-9]\d{6}|[1-9]\d{5}|[1-9]\d{4}|[1-9]\d{3}|[1-9]\d{2}|[1-9]\d|\d)$/ ) {

        print "Match at line $.\n";
        print "$line"
    }

}

しかし、正規表現を32ビットの数字に一致させる最初のステップにさえ到達できません(その問題に取り組んだら、タブを必要な方法にすることに取り組むことができます)

この問題を正しい方法で解決していますか? 何かご意見は?

4

3 に答える 3

6

私はこの問題を正しい方法で解決していますか?

検証が実際に必要であると仮定すると、私の最初のアプローチは、タブで分割し、フィールドの数をチェックし、各フィールドをチェックすることですが、正規表現を使用することはありません。正規表現で範囲チェックを行うのはばかげています!(sprintfを使用してパディングしてから文字列比較を実行すると、オーバーフローの問題が解決されます。)

その他の問題:

  • \d0〜9だけではありません。/\d/aまたはを使用し、 /[0-9]/0〜9だけを一致させたい場合。
  • 負の数はどうですか?32ビット整数を使用して2147483647..-2147483648を格納することもできます。
  • 先行ゼロと先行プラスまたはマイナス記号はどうですか?
  • 千のセパレーターはどうですか?
  • 10.0整数ですか?数学的に言えば、そうです。Perlはそれを整数として保存します。
于 2012-10-10T05:18:41.460 に答える
2

いいえ、これは正しい方法ではありません。その正規表現に従うのは非常に困難です。それは可能ですが、明日意味があるかどうかを検討してください。または、範囲が変更されたり、フォーマットにわずかな変更が必要な場合に変更するのがどれほど難しいか:)

これが私の提案です:

  1. それは数字ですか?値が数値であるかどうかを判断する方法を見つけ、そうである場合は、それを1として抽出します。つまり、文字列ではなく、実際の数値を取得します。「有効な」番号を制限する必要がある場合は、この段階で追加のチェックを行うことができます。範囲を制限するのではなく、形式だけを制限します。

  2. 抽出された数の単純な範囲チェックを使用します-この場合は0から232-1の間ですか?

于 2012-10-10T06:10:16.667 に答える