使用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=null4.5.0:major=4,minor=5,patch=0v1.1.0-bar:major=1,minor=1,patch=0,compat_suffix=barv1.2:major=1,minor=2,patch=null
可选优化
如果兼容前缀里包含-,当前正则会把前缀到最后一个-的内容全部捕获。若想只捕获第一个-之前的前缀,可将前缀部分的^.*改为^[^-]*:
(?:(?<compat_prefix>^[^-]*)-)?[vV]?(?<version>(?<major>\d+)(?:\.(?<minor>\d+)(?:\.(?<patch>\d+))?)?)(?:-(?<compat_suffix>.*$))?
内容的提问来源于stack exchange,提问作者dacucar
相关产品推荐
相关产品推荐

