正则表达式匹配没有固定长度的字符串

时间:2018-06-14 10:05:02

标签: javascript regex alphanumeric

我有这样的字符串

01084700069811461719010010285322921DA192089940088
01084700088763891719050010BM2120

这些字符串是datamatrix字符串,我必须以这种方式分割字符串

0108470006981146 17190100 102853229 21DA192089940088

0108470008876389 17190500 10BM2120

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

  • 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”也是下一个区块的起始代码。

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

感谢所有

2 个答案:

答案 0 :(得分:1)

您可以使用

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

请参阅regex demo

请注意,如果您计划对捕获组进行量化,则不必将捕获组包装为非捕获组,您可以直接量化捕获组。

此外,要使一个组可选,使用?量词就足够了,因为*匹配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_],因为\w也匹配_

答案 1 :(得分:0)

var inputValue = “01084700088763891719050010BM2120”;

var regexpr = /(01 \ d {14})(17 \ d {6})(10 [A-Za-z0-9] {1,20})(21 [A-Za-z0-9 ] {1,20})/;

inputValue.replace(regexpr,“$ 1 $ 2 $ 3 $ 4”);

输出将是:

  

“0108470008876389 17190500 10BM 2120”

var inputValue = “01084700069811461719010010285322921DA192089940088”;

var regexpr = /(01 \ d {14})(17 \ d {6})(10 [A-Za-z0-9] {1,20})(21 [A-Za-z0-9 ] {1,20})/;

inputValue.replace(regexpr,“$ 1 $ 2 $ 3 $ 4”);

输出将是:

  

“0108470006981146 17190100 102853229 21DA192089940088”