假设我有一个要解析的文本文件,其中包含一些固定长度的内容:
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个字符.有什么建议?
不不不不!:-)
为什么人们会坚持尝试将如此多的功能打包到单个RE或SQL语句中?
我的建议,做一些像:
"\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()上面没有什么不同.