Регулярные выражения не являются ответом на каждую отдельную проблему. Мой совет будет делать что-то вроде:
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.
- Второе совпадение 1000-1299.
- Третий матч 1300-1329.
- Финал соответствует 1330 и 1331.
Обновление:
Просто в комментарии к элегантности есть много форм элегантности, одним из которых является регулярное выражение. Вы также можете достичь элегантности, просто абстрагируя валидацию от отдельной функции или макроса, а затем вызывая ее из своего кода:
if isValidSomethingOrOther(str) ...
где SomethingOrOther
- конкретный бизнес-объект. Это позволяет вам легко изменить представление о допустимом объекте, даже используя регулярное выражение по вашему желанию или любые другие проверки, которые вы считаете подходящими (например, мою функцию выше).
Это позволяет вам учитывать любые изменения в строке, например, требование, чтобы эти объекты теперь были простыми числами.
Я уверен, что мог бы написать регулярное выражение "простое число меньше 1332". Я также уверен, что не хотел бы хотеть - я бы предпочел закодировать это как функцию (или таблицу поиска для необработанной скорости), тем более что регулярное выражение, скорее всего, будет выглядеть так:
^2|3|5|7| ... |1327$
в любом случае.