gpt4 book ai didi

正则表达式检查带有压缩空间的固定长度字段

转载 作者:行者123 更新时间:2023-12-01 09:39:55 25 4
gpt4 key购买 nike

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com