如何解决捕获在定长字符串中补零的变长组
我使用正则表达式验证集合中的字符串,并从每个有效字符串中提取几条数据。我想改善提取效果,以减少捕获组1的零填充。
有效字符串序列为20个字符:
(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 -
$
字符串结尾
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。