Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/373.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 匹配无固定长度字符串的正则表达式_Javascript_Regex_Alphanumeric - Fatal编程技术网

Javascript 匹配无固定长度字符串的正则表达式

Javascript 匹配无固定长度字符串的正则表达式,javascript,regex,alphanumeric,Javascript,Regex,Alphanumeric,我有一根这样的弦 01084700069811461719010010285322921DA192089940088 01084700088763891719050010BM2120 这些字符串是datamatrix字符串,我必须以这种方式拆分字符串 0108470006981146 17190100 102853229 21DA192089940088 0108470008876389 17190500 10BM2120 每个块以一个固定的代码开头,后面是数字或字符 01+14位 17

我有一根这样的弦

01084700069811461719010010285322921DA192089940088
01084700088763891719050010BM2120
这些字符串是datamatrix字符串,我必须以这种方式拆分字符串

0108470006981146 17190100 102853229 21DA192089940088

0108470008876389 17190500 10BM2120
每个块以一个固定的代码开头,后面是数字或字符

  • 01+14位
  • 17+6位
  • 10+从1个字符到20个字符
  • 21+从1个字符到20个字符
我尝试使用正则表达式来实现这一点,对于前两个块,我没有问题,因为长度是固定的。我在第三个(和/或第四个)街区遇到问题

我创建了这个regexp

/^(01\d{14})(?:(17\d{6}))*(?:(10\w*))*(?:(21\w*))*$/
因为这个字符串是正确的

01084700088763891719050010BM2120

Group 1. 0108470008876389 (ok)

Group 2. 17190500 (ok)

Group 3. 10BM2120 (ok)
但对于另一根弦

01084700069811461719010010285322921DA192089940088
regexp匹配

Group 1. 0108470006981146 (ok)

Group 2. 17190100 (ok)

Group 3. 10285322921DA192089940088 (no)
我无法创建能够正确匹配第三个和第四个块的regexp,因为没有固定长度的字符,并且第三个块中可能有字符串“21”,这也是下一个块的开始代码

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

感谢所有

您可以使用

^(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\u]
,因为
\w
也匹配
\u

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”

变量输入值=“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”)

输出将是:

“010847000698114617190100 102853229 21DA192089940088”


如果这些块是连续的,
b
c
d
可以是可选的,请尝试。第三个和第四个块以“10”和“21”开头,在正则表达式中由(?(10\w))*(?:(21\w*)*部分匹配。第三个区块以“10”开头,can内包含数字21,但21也是第四个区块的起始代码。两个块都没有固定的长度请参见。这是你想要达到的吗?好球。似乎工作得很好!:D谢谢,你救了我一天为什么
0108470008876389 17190500 10BM 2120
无效?我喜欢regexp,但也很危险:D.你有这样的资源来掌握regexp吗?@AngelPoyel这种regex知识并不先进,你可以在。从
\w
中减去
\u
有点“隐藏”,您可以在下面了解这一点。