微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

捕获在定长字符串中补零的变长组

如何解决捕获在定长字符串中补零的变长组

我使用正则表达式验证集合中的字符串,并从每个有效字符串中提取几条数据。我想改善提取效果,以减少捕获组1的零填充。

有效字符串序列为20个字符:

  • 文字00100
  • 6个字母数字字符
    • 1-6个有意义的字符(我希望在一个捕获组中的字符)
    • 左零填充最多6个字符
  • 9位数字

(S1)是有效的字符串:00100000C13540040124
(R1)是我当前的正则表达式:^00100(\w{6})(\d{4})(\d)(\d{4})$

(R1)从(S1)返回四个捕获组:

  • g1:000C13
  • g2:5400
  • g3:4
  • g4:0124

我需要将(R1)修改为:

  • 返回g1:C13(修剪掉左零)
  • 维护所有其他捕获组
  • 保持验证要求

不能使用正则表达式之外的代码修剪g1。如果需要,我可以添加并重新编号捕获组。

(R2)是我尝试排除零填充的方法^001000{0,5}([^0]{1,6})(\d{4})(\d)(\d{4})$

(R2)从(S1)返回所需的四个捕获组:

  • g1:C13
  • g2:5400
  • g3:4
  • g4:0124

(S2)是无效字符串:0010000000P3436040077
(S3)是无效字符串:0010000P3436040077000

(R2)无法拒绝(S2),它是21个字符,但是发生会返回正确的捕获组数据:

  • g1:P3
  • g2:4360
  • g3:4
  • g4:0077

(R2)无法拒绝(S3),即21个字符,并且返回不正确的捕获组数据:

  • g1:P3436
  • g2:0400
  • g3:7
  • g4:7000

我还有另外两个想法,但是我不知道是否或者如何使它们与.NET正则表达式解析器一起工作:

  • 计算零填充并相应地动态调整g1的大小(例如,当4个零时,g1将有效地为(\w{2})
  • 保留(R2)的变长子句(0{0,6}))并在独立子句中验证20个字符的长度

只要其他想法符合我的要求,我就会开放。感谢您的考虑!

解决方法

您可以使用[^\W0]来匹配除0以外的字符char,因为[^0]可以匹配除0以外的任何char,这是更广泛的匹配。然后使用\w{0,5}匹配0-5个字符,使其总共为1-6个字符。

您可以将其与您尝试过的R2一起使用,并在正向前加肯定以断言该字符串包含20个单词字符。

^(?=\w{20}$)001000{0,5}([^\W0]\w{0,5})(\d{4})(\d)(\d{4})$

说明

  • ^字符串的开头
  • (?=\w{20}$)正向查找,声明一个长度为20个字符的字符串
  • 001000{0,5}匹配00100,后跟0-5乘以零
  • (捕获第1组
    • [^\W0]\w{0,5}匹配除0后跟0-5个字符char的任何字符char
  • )关闭群组
  • (\d{4})(\d)(\d{4})捕获与末尾数字匹配的组2、3和4
  • $字符串结尾

查看regex demo

enter image description here

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。