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

标签 regex

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

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/

相关文章:

java模式匹配正则表达式

javascript - 包含小写、大写、字母数字、特殊字符的正则表达式,且一行中相同字符不超过 2 个,最小长度为 8 个字符

javascript - 删除字符串中的反斜杠

regex - 使用 sed 反转列

java - 如何使用在字符串开头仍然有效的后向断言制作正则表达式

r - 如何使用 stringr 将两个正则表达式与 if else 结合起来

regex - 具有两种不同条件的 .htaccess RewriteRule

javascript - 获取 JavaScript 正则表达式中除匹配之外的所有内容

javascript正则表达式替换括号之间的空格

Java 匹配单个单词,可以用空格分隔,也可以不用空格分隔