捕获固定长度字符串中零填充的可变长度组

Capture variable-length group that is zero-padded in a fixed-length string

我使用正则表达式来验证集合中的字符串,并从每个有效字符串中提取几条数据。我想改进提取,实际上 trim 来自捕获组 1 的零填充。

有效的字符串序列是 20 个字符:

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

(R1) returns 来自 (S1) 的四个捕获组:

我需要将 (R1) 修改为:

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

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

(R2) returns (S1) 中所需的四个捕获组:

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

(R2) 未能拒绝 (S2),这是 21 个字符,但 发生 到 return 正确的捕获组数据:

(R2) 未能拒绝 (S3),即 21 个字符,并且 returns 不正确的捕获组数据:

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

我愿意接受其他想法,只要它们符合我的要求。感谢考虑!

您可以使用 [^\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