javascript - 匹配没有固定长度的字符串的正则表达式
问题描述
我有这样的字符串
01084700069811461719010010285322921DA192089940088
01084700088763891719050010BM2120
这些字符串是数据矩阵字符串,我必须以这种方式拆分字符串
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})?$
查看正则表达式演示
请注意,如果您打算量化捕获组,则不必将捕获组与非捕获组包装,您可以直接量化捕获组。
此外,要使组成为可选,使用?
量词就足够了,因为*
匹配 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 \w
also matches _
。
推荐阅读
- python - Pandas 横向和纵向求和聚合
- python - 我想再训练 4 个 Word2vec 模型并对生成的嵌入矩阵进行平均
- python - 如何使用文本标签自定义 Seaborn Heatmap 中的颜色条
- javascript - React 导出上下文返回解析错误:未定义导出“SearchContextConsumer”
- python - 将 python 变量传递给 SQL 查询
- linux - 如何从 Azure 管道连接到私有容器实例?
- javascript - 具有 JSON 服务器的不同唯一键
- php - PHP Scraper 从谷歌航班获取航班价格
- python-3.x - Flask-seeder 初始数据,为什么 faker.create 不在控制台打印任何内容?
- mysql - 使用 for 循环和多个 orWhen 为图表构建数组