固定宽度字段的正则表达式

Lai*_*ira 4 regex field fixed-length-record

我需要将文件布局上的固定宽度字段与正则表达式匹配.该字段为数字/整数,始终包含四个字符,包含在0..1331范围内.当数字小于1000时,字符串用左零填充.所以这些例子都是有效的:

  • 0000
  • 0001
  • 0010
  • 1000
  • 1331

但下面必须不能接受:

  • 1
  • 01
  • 10
  • 100
  • 4759

如果我只能用正则表达式强制实施这个限制,那就太好了.玩了一会后,我得出了表达\0*[0-1331]\.问题是它不会将大小限制为四个字符.我当然可以做,\000[0-9]|00[10-99]|0[100-999]|[1000-1331]\但我拒绝使用如此令人讨厌的东西.谁能想到更好的方法?

pax*_*blo 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
Run Code Online (Sandbox Code Playgroud)

如果你必须使用正则表达式,你的解决方案没有任何问题,但我可能会使用以下变体(仅基于我对RE引擎及其工作方式的理解):

^0[0-9]{3}|1[0-2][0-9]{2}|13[0-2][0-9]|133[01]$
Run Code Online (Sandbox Code Playgroud)
  • 第一部分匹配0000-0999.
  • 第二场比赛1000-1299.
  • 第三场比赛是1300-1329.
  • 最后一场比赛是1330和1331.

更新:

就优雅评论而言,有许多形式的优雅,其中正则表达是其中之一.您还可以通过将验证抽象为单独的函数或宏来实现优雅,然后从代码中调用它:

if isValidSomethingOrOther(str) ...
Run Code Online (Sandbox Code Playgroud)

SomethingOrOther具体的业务对象在哪里.这使您可以轻松地更改有效对象的想法,甚至可以根据需要使用正则表达式或您认为合适的任何其他检查(例如上面的函数).

这允许您满足线下的任何更改,例如这些对象现在必须是素数的要求.

我敢肯定我可以写一个"素数少于1332"的正则表达式.我同样肯定我不想 - 我更喜欢将其编码为函数(或原始速度的查找表),特别是因为正则表达式很可能看起来像:

^2|3|5|7| ... |1327$
Run Code Online (Sandbox Code Playgroud)

无论如何.