JavaScript正则匹配版本号:修复第三段多位数及Patch后多位数匹配问题
版本号匹配正则的修复方案
问题背景
我需要用正则匹配格式混乱的版本号并存入数组,版本号格式多样:有的是纯数字三段式,有的后面带Rev/Phase/Release,还有的在这些后缀后再加Patch 001、Delta、Lib之类的内容。
当前正则有两个硬伤:
- 版本号第三段数字超过9时,只能匹配前一位(比如
4.2.13只抓到4.2.1) - 没法完整匹配
Patch后面的多位数(比如Patch 001匹配异常)
原正则代码:
arDOORSValues = DOORSVal.match(/(\d{1,}[.]\d+[.]\d+){1}\s?(Rev|Phase|Release)?\s?[a-zA-Z]*(-)?\s?(Patch\s?\d+|Delta|Lib|TBD)?/g);
测试字符串:4.1.04.3.5 Rev -4.3.5 Rev A4.3.5 Rev A Delta4.2.134.3.3Lib4.3.5 Patch 001
预期输出数组:["4.1.0","4.3.5 Rev -","4.3.5 Rev A","4.3.5 Rev A Delta","4.2.13","4.3.3Lib","4.3.5 Patch 001"]
试了各种修改都不行:把(Patch...)后面的问号去掉,只能匹配到带Delta和Patch的条目;改成星号,第三段多位数又被截断;保留问号,两个问题都没解决。
问题根源
- 版本号截断问题:原正则没有明确的匹配边界,第三段的
\d+虽然是贪婪匹配,但后面的[a-zA-Z]*等可选结构会让正则在找到第一个可能的结束点就停止,导致多位数被截断。 - Patch匹配问题:原正则里
(Patch...)是可选(问号),所以正则经常在匹配完版本号或Rev后缀后就直接结束,不会继续匹配Patch内容;但如果去掉问号改成必填,又会过滤掉不带这些内容的版本号。
修复后的正则
const arDOORSValues = DOORSVal.match(/\d+\.\d+\.\d+(?:\s?(Rev|Phase|Release)\s?(?:[A-Z-]|\s)*)?(?:\s?(?:Patch\s\d+|Delta|Lib|TBD))?(?=\d|$)/g);
关键修改说明
- 版本号核心:用
\d+\.\d+\.\d+直接匹配三段数字,去掉冗余的{1}和分组,确保第三段不管多少位都能完整捕获。 - Rev后缀处理:用非捕获分组
(?:...)包裹后缀逻辑,(?:[A-Z-]|\s)*匹配Rev后面的字母、连字符或空格,能覆盖Rev -、Rev A这类场景。 - 附加内容匹配:
Patch\s\d+明确匹配Patch加空格加任意位数数字(包括前导零),确保Patch 001完整被抓;同时把这部分设为可选,不影响纯版本号或只带Rev的条目。 - 边界控制:末尾加
(?=\d|$)正向预查,确保当前匹配的内容后面要么是下一个版本号的开头数字,要么是字符串结尾,彻底解决版本号被截断的问题。
测试结果
用给定的测试字符串匹配后,输出完全符合预期:["4.1.0","4.3.5 Rev -","4.3.5 Rev A","4.3.5 Rev A Delta","4.2.13","4.3.3Lib","4.3.5 Patch 001"]
内容的提问来源于stack exchange,提问作者JenPann
相关产品推荐
相关产品推荐

