正则表达式并不是每个问题的答案。我的建议是做类似的事情:
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$
反正。