假设我有一个要解析的文本文件,其中包含一些固定长度的内容:
123jackysee 45678887
456charliewong 32145644
<3><------16------><--8---> # Not part of the data.
前三个字符是 ID,然后是 16 个字符的用户名,然后是 8 位数的电话号码。
我想写一个正则表达式来匹配和验证每一行的输入,我想出的那个:
(\d{3})([A-Za-z ]{16})(\d{8})
用户名应包含 8-16 个字符。但是 ([A-Za-z ]{16})
也会匹配空值或空格。我想到了 ([A-Za-z]{8,16} {0,8})
但它会检测到超过 16 个字符。有什么建议吗?
最佳答案
不,不,不,不! :-)
为什么人们坚持尝试将这么多功能打包到单个 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}$"):
不要误以为这是干净的 Python 代码,它实际上是 PaxLang,我自己的专有伪代码。希望它足够清楚,第一行检查长度是否为 27,第二行与给定 RE 匹配。
由于第一行和其他两个字段在 RE 中是固定长度的事实,中间字段自动总计 16 个字符。 RE 还确保它是 8 个或更多 alphas,后跟正确数量的空格。
用一个 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}$
您可以通过确保它通过两个单独的 RE来做到这一点:
^\d{3}[A-za-z]{8,} *\d{8}$
^.{27}$
但是,由于最后一个只是长度检查,它与上面的 isValidLine()
没有什么不同。
关于正则表达式检查带有压缩空间的固定长度字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1258405/