我需要将文件布局上的固定宽度字段与正则表达式进行匹配。该字段是数字/整数,始终有四个字符,并且包含在 0..1331 范围内。当数字小于 1000 时,字符串将用左零填充。所以所有这些例子都是有效的:
但必须是以下内容not公认:
如果我只能使用正则表达式强制执行此限制,那就太好了。玩了一会后,我产生了这个表情\0*[0-1331]\
。问题是它没有将大小限制为四个字符。我当然可以\000[0-9]|00[10-99]|0[100-999]|[1000-1331]\
但我拒绝使用如此讨厌的东西。有人能想出更好的方法吗?
正则表达式不是问题的答案every单一问题。我的建议是做类似的事情:
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
If you must使用正则表达式,您的解决方案没有任何问题,但我可能会使用以下变体(仅基于我对 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。
Update:
仅就优雅注释而言,优雅有多种形式,正则表达式就是其中之一。您还可以通过将验证抽象为单独的函数或宏,然后从代码中调用它来实现优雅:
if isValidSomethingOrOther(str) ...
where SomethingOrOther
是一个具体的业务对象。这使您可以轻松地改变对有效对象的想法,甚至可以根据需要使用正则表达式或您认为合适的任何其他检查(例如上面的我的函数)。
这使您可以满足任何变化,例如这些对象现在必须是质数的要求。
我确信我could编写一个“素数小于 1332”正则表达式。我同样确信我不会wantto - 我更喜欢将其编码为函数(或原始速度的查找表),特别是因为正则表达式很可能看起来像:
^2|3|5|7| ... |1327$
anyway.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)