4

ファイルレイアウトの固定幅フィールドを正規表現と一致させる必要があります。フィールドは数値/整数で、常に4文字で、0..1331の範囲に含まれます。数値が1000より小さい場合、文字列は左ゼロで埋められます。したがって、これらの例はすべて有効です。

  • 0000
  • 0001
  • 0010
  • 1000
  • 1331

ただし、次のことは受け入れてはなりません。

  • 1
  • 01
  • 10
  • 100
  • 4759

正規表現でのみこの制限を適用できればいいのですが。少し遊んだ後、式を出しました\0*[0-1331]\。問題は、サイズが4文字に制限されていないことです。もちろんできます\000[0-9]|00[10-99]|0[100-999]|[1000-1331]\が、とても厄介なものを使うことを拒否します。誰かがより良い方法を考えることができますか?

4

2 に答える 2

7

正規表現は、すべての問題に対する答えではありません。私のアドバイスは次のようなことをすることです:

boolean isValidSomethingOrOther (string):
    if string.length() != 4:
        return false
    for each character in string:
        if not character.isNumeric():
            return false
    if string.toInt() > 1331:
        return false
    return true

正規表現を使用する必要がある場合は、ソリューションに問題はありませんが、おそらく次のバリアントを使用します(REエンジンとその動作についての私の理解に基づいています)。

^0[0-9]{3}|1[0-2][0-9]{2}|13[0-2][0-9]|133[01]$
  • 最初のセクションは0000-0999に一致します。
  • 2番目は1000-1299に一致します。
  • 3番目は1300〜1329に一致します。
  • 最後のものは1330と1331に一致します。

アップデート:

エレガンスコメントだけで、正規表現が1つであるエレガンスの多くの形式があります。検証を別の関数またはマクロに抽象化して、コードから呼び出すだけで、エレガンスを実現することもできます。

if isValidSomethingOrOther(str) ...

SomethingOrOther具体的なビジネスオブジェクトはどこにありますか。これにより、必要に応じて正規表現を使用したり、適切と思われるその他のチェック(上記の私の関数など)を使用したりしても、有効なオブジェクトのアイデアを簡単に変更できます。

これにより、これらのオブジェクトを素数にする必要があるという要件など、今後の変更に対応できます。

「prime-number-less-than-1332」正規表現を記述できると確信しています。私は同じようにしたくないと確信しています-特に正規表現は次のように見える可能性が高いため、関数(または生の速度のルックアップテーブル)としてコード化することをお勧めします。

^2|3|5|7| ... |1327$

とりあえず。

于 2009-08-21T01:47:38.013 に答える
1

これは簡単すぎるようですが、問題を正しく理解していますか?

\[01][0-9]{3}\

範囲内の整数が何を意味するのかわかりませんか?それはperlismか何かでなければなりません。

これはあなたが私に望むように機能するようです:

In [3]: r = re.compile(r'[01][0-9]{3}')

In [4]: r.match('0001')
Out[4]: <_sre.SRE_Match object at 0x2fa2d30>

In [5]: r.match('1001')
Out[5]: <_sre.SRE_Match object at 0x2fa2cc8>

In [6]: r.match('2001')

In [7]: r.match('001')

In [8]: 
于 2009-08-21T01:49:19.803 に答える