JavaScript正则(/gm)匹配主次构建版本未变更软件的问题求解
正则解决方案
适用约束
- JavaScript 风味正则
- 强制开启
/gm标识 - 匹配规则:仅匹配升级前后主版本、次版本、构建版本完全一致,仅修订后缀变化的
[UPGRADE]行
最终正则
/^\[UPGRADE\]\s+([\w\-.]+)\s+(?:([^\s-]+)-(\S+)|(\S*?)(\d+))\s+->\s+(?:(?:\2-(\S+))|(?:\4(\d+)))$/gm
分组说明
匹配成功后可按如下规则提取所需的5个分组内容:
- 软件名:固定取第1捕获组内容
- 升级前核心版本:如果第2捕获组有值则取第2组,否则取第4组
- 升级前后缀:如果第2捕获组有值则取第3组,否则取第5组
- 升级后核心版本:和升级前核心版本完全一致,直接复用第2/4组内容即可
- 升级后后缀:如果第2捕获组有值则取第6组,否则取第7组
正则逻辑解释
- 行首锚定
^匹配[UPGRADE]标记,直接过滤非升级类行 - 第一捕获组
([\w\-.]+)匹配软件名,支持常规软件名允许的字母、数字、短横线、点、下划线 - 旧版本匹配用分支兼容两种常见版本格式:
- 带
-分隔的版本:用([^\s-]+)匹配-之前的核心版本,-之后所有非空格字符作为后缀 - 不带
-分隔的版本:用非贪婪匹配(\S*?)捕获末尾连续数字之前的核心版本,末尾连续数字作为后缀
- 带
- 新版本部分通过反向引用
\2、\4强制要求核心版本和旧版本完全一致,只有符合升级前后核心版本不变的行才会被匹配 - 行尾锚定
$确保整行匹配,避免局部匹配错误
原正则错误说明
你之前编写的正则核心问题是没有明确用-作为核心版本和后缀的分隔边界,第二组的[\d\.\:]+d?f?s?g?是按顺序可选匹配单个d/f/s/g字符,无法完整匹配dfsg字符串,模糊的字符集匹配导致边界判断错误,把属于后缀的字符错误匹配到核心版本分组中。
内容的提问来源于stack exchange,提问作者Bangkockney
相关产品推荐
相关产品推荐

