正则表达式检查具有打包空间的修复长度字段

jac*_*see 3 regex

假设我有一个要解析的文本文件,其中包含一些固定长度的内容:

123jackysee        45678887
456charliewong     32145644
<3><------16------><--8---> # Not part of the data.
Run Code Online (Sandbox Code Playgroud)

前三个字符是ID,然后是16个字符的用户名,然后是8位电话号码.

我想写一个正则表达式来匹配并验证每一行的输入,我提出的那个:

(\d{3})([A-Za-z ]{16})(\d{8})
Run Code Online (Sandbox Code Playgroud)

用户名应包含8-16个字符.但([A-Za-z ]{16})也会匹配空值或空格.我想,([A-Za-z]{8,16} {0,8})但它会检测超过16个字符.有什么建议?

pax*_*blo 8

不不不不!:-)

为什么人们会坚持尝试将如此多的功能打包到单个RE或SQL语句中?

我的建议,做一些像:

  • 确保长度为27.
  • 将三个组件提取为单独的字符串(0-2,3-18,19-26).
  • 检查第一个匹配"\d{3}".
  • 检查第二个匹配"[A-Za-z]{8,} *".
  • 检查第三个匹配"\d{8}".

如果您希望整个检查适合一行源代码,请将其放入函数中isValidLine(),然后调用它.

即便是这样的事情也可以解决问题:

def isValidLine(s):
    if s.len() != 27 return false
    return s.match("^\d{3}[A-za-z]{8,} *\d{8}$"):
Run Code Online (Sandbox Code Playgroud)

不要误以为这是干净的Python代码,它实际上是PaxLang,我自己的专有伪代码.希望很明显,第一行检查长度为27,第二行与给定RE匹配.

由于第一行,中间字段总共自动16个字符,并且其他两个字段在RE中是固定长度的.RE还确保它有八个或更多个alpha,然后是正确的空格数.

用一个RE做这种事情就像是一些怪物:

^\d{3}(([A-za-z]{8} {8})
      |([A-za-z]{9} {7})
      |([A-za-z]{10} {6})
      |([A-za-z]{11} {5})
      |([A-za-z]{12}    )
      |([A-za-z]{13}   )
      |([A-za-z]{14}  )
      |([A-za-z]{15} )
      |([A-za-z]{16}))
      \d{8}$
Run Code Online (Sandbox Code Playgroud)

您可以通过确保它通过两个单独的 RE来实现:

^\d{3}[A-za-z]{8,} *\d{8}$
^.{27}$
Run Code Online (Sandbox Code Playgroud)

但是,由于最后一个只是一个长度检查,它与isValidLine()上面没有什么不同.