首页 > 解决方案 > 匹配没有固定长度的字符串的正则表达式

问题描述

我有这样的字符串

01084700069811461719010010285322921DA192089940088
01084700088763891719050010BM2120

这些字符串是数据矩阵字符串,我必须以这种方式拆分字符串

0108470006981146 17190100 102853229 21DA192089940088

0108470008876389 17190500 10BM2120

每个块都以固定代码开头,后跟数字或字符

我尝试使用正则表达式来实现这一点,并且对于前两个块我没有问题,因为长度是固定的。我对第三个(和/或第四个)块有问题。

我创建了这个正则表达式

/^(01\d{14})(?:(17\d{6}))*(?:(10\w*))*(?:(21\w*))*$/

因为这个字符串是正确的

01084700088763891719050010BM2120

Group 1. 0108470008876389 (ok)

Group 2. 17190500 (ok)

Group 3. 10BM2120 (ok)

但对于另一个字符串

01084700069811461719010010285322921DA192089940088

正则表达式匹配

Group 1. 0108470006981146 (ok)

Group 2. 17190100 (ok)

Group 3. 10285322921DA192089940088 (no)

我无法创建一个能够正确匹配第三个和第四个块的正则表达式,因为没有固定长度的字符,并且因为在第三个块中可能有字符串“21”也是下一个块的起始码。

可以创建一个正确匹配字符串所有部分的正则表达式。

谢谢大家

标签: javascriptregexalphanumeric

解决方案


您可以使用

^(01\d{14})(17\d{6})?(10\w{1,20})?(21\w{1,20})?$

查看正则表达式演示

请注意,如果您打算量化捕获组,则不必将捕获组与非捕获组包装,您可以直接量化捕获组。

此外,要使组成为可选,使用?量词就足够了,因为*匹配 0 次或多次出现。

图案细节

  • ^- 字符串的开始
  • (01\d{14})- 第 1 组:01和 24 位数字
  • (17\d{6})?- 第 2 组(可选):17和 6 位数字
  • (10\w{1,20})?- 第 3 组(可选):10和 1 到 20 个字字符
  • (21\w{1,20})?- 第 4 组(可选):21和 1 到 20 个字字符
  • $- 字符串结束。

请注意,要仅匹配字母数字字符,您需要替换\w[^\W_]since \walso matches _


推荐阅读