【发布时间】:2018-11-24 01:51:00
【问题描述】:
我有这样的字符串
01084700069811461719010010285322921DA192089940088
01084700088763891719050010BM2120
那些字符串是datamatrix字符串,我必须以这种方式拆分字符串
0108470006981146 17190100 102853229 21DA192089940088
0108470008876389 17190500 10BM2120
每个块都以固定代码开头,后跟数字或字符
- 01 + 14 位
- 17 + 6 位数字
- 10 + 1 到 20 个字符
- 21 + 1 到 20 个字符
我尝试使用正则表达式来实现这一点,并且对于前两个块我没有问题,因为长度是固定的。我对第三个(和/或第四个)块有问题。
我创建了这个正则表达式
/^(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”也是下一个区块的起始码。
可以创建一个正确匹配字符串所有部分的正则表达式。
谢谢大家
【问题讨论】:
-
如果这些块是连续的,请尝试
^(01\d{14})(17\d{6})?(10\w{1,20})?(21\w{1,20})?$,并且b、c或d可以是可选的。 -
第3和第4块以“10”和“21”开头,在正则表达式中用(?:(10\w))*(? :(21\w*))* 部分。第 3 块以“10”开头,可以在里面包含数字 21,但 21 也是第 4 块的起始码。两个块都没有固定长度
-
见regex101.com/r/0p9Uz5/1。是你想要达到的吗?
-
不错的镜头。似乎运作良好! :D 谢谢,你拯救了我的一天
-
为什么
0108470008876389 17190500 10BM 2120无效?
标签: javascript regex alphanumeric