正規表現は、すべての問題に対する答えではありません。私のアドバイスは次のようなことをすることです:
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$
とりあえず。