捕获固定长度字符串中零填充的可变长度组
Capture variable-length group that is zero-padded in a fixed-length string
我使用正则表达式来验证集合中的字符串,并从每个有效字符串中提取几条数据。我想改进提取,实际上 trim 来自捕获组 1 的零填充。
有效的字符串序列是 20 个字符:
- 文字
00100
- 6 个字母数字字符
- 1-6 个有意义的字符(一个捕获组中我想要的字符)
- 左边零填充最多 6 个字符
- 9 位数
(S1) 是一个有效的字符串:00100000C13540040124
(R1) 是我当前的正则表达式:^00100(\w{6})(\d{4})(\d)(\d{4})$
(R1) returns 来自 (S1) 的四个捕获组:
- g1:
000C13
- g2:
5400
- g3:
4
- g4:
0124
我需要将 (R1) 修改为:
- return g1:
C13
(左零为 trimmed)
- 维护所有其他捕获组
- 维护验证要求
I 不能 trim g1 使用正则表达式之外的代码。如果需要,我可以 添加和重新编号捕获组。
(R2) 是我排除零填充的尝试:^001000{0,5}([^0]{1,6})(\d{4})(\d)(\d{4})$
(R2) returns (S1) 中所需的四个捕获组:
- g1:
C13
- g2:
5400
- g3:
4
- g4:
0124
(S2) 是一个 无效的 字符串:0010000000P3436040077
(S3) 是一个 无效的 字符串:0010000P3436040077000
(R2) 未能拒绝 (S2),这是 21 个字符,但 发生 到 return 正确的捕获组数据:
- g1:
P3
- g2:
4360
- g3:
4
- g4:
0077
(R2) 未能拒绝 (S3),即 21 个字符,并且 也 returns 不正确的捕获组数据:
- g1:
P3436
- g2:
0400
- g3:
7
- g4:
7000
我还有另外两个想法,但我不知道是否或如何使它们与 .NET 正则表达式解析器一起工作:
- 计算零填充并相应地动态调整 g1 的大小(例如,当 4 个零时,g1 将有效地
(\w{2})
)
- 保留 (R2) 的可变长度子句 (
0{0,5}([^0]{1,6})
) 并在独立子句中验证 20 个字符的长度
我愿意接受其他想法,只要它们符合我的要求。感谢考虑!
您可以使用 [^\W0]
来匹配除 0 之外的字符字符,因为 [^0]
会匹配除 0 之外的任何字符,这是更广泛的匹配。然后使用 \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 个单词字符之外的任何单词字符
)
关闭群组
(\d{4})(\d)(\d{4})
捕获匹配末尾数字的第2、3、4组
$
字符串结束
看到一个regex demo
我使用正则表达式来验证集合中的字符串,并从每个有效字符串中提取几条数据。我想改进提取,实际上 trim 来自捕获组 1 的零填充。
有效的字符串序列是 20 个字符:
- 文字
00100
- 6 个字母数字字符
- 1-6 个有意义的字符(一个捕获组中我想要的字符)
- 左边零填充最多 6 个字符
- 9 位数
(S1) 是一个有效的字符串:00100000C13540040124
(R1) 是我当前的正则表达式:^00100(\w{6})(\d{4})(\d)(\d{4})$
(R1) returns 来自 (S1) 的四个捕获组:
- g1:
000C13
- g2:
5400
- g3:
4
- g4:
0124
我需要将 (R1) 修改为:
- return g1:
C13
(左零为 trimmed) - 维护所有其他捕获组
- 维护验证要求
I 不能 trim g1 使用正则表达式之外的代码。如果需要,我可以 添加和重新编号捕获组。
(R2) 是我排除零填充的尝试:^001000{0,5}([^0]{1,6})(\d{4})(\d)(\d{4})$
(R2) returns (S1) 中所需的四个捕获组:
- g1:
C13
- g2:
5400
- g3:
4
- g4:
0124
(S2) 是一个 无效的 字符串:0010000000P3436040077
(S3) 是一个 无效的 字符串:0010000P3436040077000
(R2) 未能拒绝 (S2),这是 21 个字符,但 发生 到 return 正确的捕获组数据:
- g1:
P3
- g2:
4360
- g3:
4
- g4:
0077
(R2) 未能拒绝 (S3),即 21 个字符,并且 也 returns 不正确的捕获组数据:
- g1:
P3436
- g2:
0400
- g3:
7
- g4:
7000
我还有另外两个想法,但我不知道是否或如何使它们与 .NET 正则表达式解析器一起工作:
- 计算零填充并相应地动态调整 g1 的大小(例如,当 4 个零时,g1 将有效地
(\w{2})
) - 保留 (R2) 的可变长度子句 (
0{0,5}([^0]{1,6})
) 并在独立子句中验证 20 个字符的长度
我愿意接受其他想法,只要它们符合我的要求。感谢考虑!
您可以使用 [^\W0]
来匹配除 0 之外的字符字符,因为 [^0]
会匹配除 0 之外的任何字符,这是更广泛的匹配。然后使用 \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 个单词字符之外的任何单词字符
)
关闭群组(\d{4})(\d)(\d{4})
捕获匹配末尾数字的第2、3、4组$
字符串结束
看到一个regex demo