You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用JQ正则提取版本组件:minor优先于patch的匹配问题

版本字符串正则匹配问题解决

问题原因

你的正则中,(?:\.(?<minor>\d+))?(?:\.(?<patch>\d+))? 是两个独立的可选分组。正则引擎匹配v1.2这类双组件版本时,会因为分组的可选性,跳过minor的匹配逻辑,直接用patch分组捕获2——这不是量词的问题,而是分组的匹配顺序导致引擎优先选择能完成匹配的路径,而非你期望的优先级。你尝试的非贪婪或占有量词,无法改变分组的匹配优先级逻辑,所以没起作用。

解决方法

调整版本组件的匹配结构,让引擎优先匹配更完整的版本格式,也就是从「major.minor.patch」到「major.minor」再到「major」的顺序来匹配,确保minor优先被捕获。

修改后的完整正则

(?:(?<compat_prefix>^.*)-)?[vV]?(?<version>(?<major>\d+)(?:\.(?<minor>\d+)(?:\.(?<patch>\d+))?)?)(?:-(?<compat_suffix>.*$))?

逻辑说明

版本部分的核心变化是把patch的匹配嵌套在minor的可选分组内:

  • 先匹配major,然后尝试匹配.minor;
  • 如果匹配到minor,再尝试匹配.patch;
  • 如果没有patch,minor会被正常捕获;如果连minor都没有,就只保留major。

这样处理后,v1.2会正确把1分配给major,2分配给minor,patch为null。

测试验证

针对示例字符串的匹配结果:

  • v2.234324:major=2,minor=234324,patch=null
  • 4.5.0:major=4,minor=5,patch=0
  • v1.1.0-bar:major=1,minor=1,patch=0,compat_suffix=bar
  • v1.2:major=1,minor=2,patch=null

可选优化

如果兼容前缀里包含-,当前正则会把前缀到最后一个-的内容全部捕获。若想只捕获第一个-之前的前缀,可将前缀部分的^.*改为^[^-]*:

(?:(?<compat_prefix>^[^-]*)-)?[vV]?(?<version>(?<major>\d+)(?:\.(?<minor>\d+)(?:\.(?<patch>\d+))?)?)(?:-(?<compat_suffix>.*$))?

内容的提问来源于stack exchange,提问作者dacucar

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:15:24