【发布时间】:2023-01-16 15:38:15
【问题描述】:
我正在尝试定义一个正则表达式,以从可能已使用不同版本控制方案格式化的字符串中提取版本控制信息。
例子:
v2.234324
4.5.0
v1.1.0-bar
v2.3-foo
V1
FEE-v1.0.2-fuu
我可以通过考虑以下要素来“概括”这些版本控制方案:
- 可选的兼容性前缀
- 一个可选的
v或V - 最多 3 个版本组件,但至少 1 个:主要、(次要)、(补丁)
- 可选的兼容性后缀
我目前正在使用以下正则表达式:
(?:(?<compat_prefix>^.*)-)?[vV]?(?<version>(?<major>\\d+)(?:\\.(?<minor>\\d+))?(?:\\.(?<patch>\\d+)?))(?:-(?<compat_suffix>.*$))?
例子:
$ echo '[{"version":"v1.2.3"},{"version":"v1.2"}]' | jq '.[].version | capture("(?:(?<compat_prefix>^.*)-)?[vV]?(?<version>(?<major>\\d+)(?:\\.(?<minor>\\d+))?(?:\\.(?<patch>\\d+)?))(?:-(?<compat_suffix>.*$))?")'
{
"compat_prefix": null,
"version": "1.2.3",
"major": "1",
"minor": "2",
"patch": "3",
"compat_suffix": null
}
{
"compat_prefix": null,
"version": "1.2",
"major": "1",
"minor": null,
"patch": "2",
"compat_suffix": null
}
这对我的目的来说效果很好。
但是当只有两个版本组件时,我希望 minor 优先于 patch.
我尝试在 patch 捕获组 ?? 上使用非贪婪匹配但没有成功:
$ echo '[{"version":"foo-v1.2"}]' | jq '.[].version | capture("(?:(?<compat_prefix>^.*)-)?[vV]?(?<version>(?<major>\\d+)(?:\\.(?<minor>\\d+))?(?:\\.(?<patch>\\d+)??))(?:-(?<compat_suffix>.*$))?")'
{
"compat_prefix": "foo",
"version": "1.",
"major": "1",
"minor": null,
"patch": null,
"compat_suffix": null
}
我还尝试在 minor 捕获组中使用所有格量词 ?+,结果类似:
$ echo '[{"version":"foo-v1.2"}]' | jq '.[].version | capture("(?:(?<compat_prefix>^.*)-)?[vV]?(?<version>(?<major>\\d+)(?:\\.(?<minor>\\d+))?+(?:\\.(?<patch>\\d+)?))(?:-(?<compat_suffix>.*$))?")'
# Nothing is returned
如果能帮助我理解为什么我的尝试不起作用以及应该怎么做,我将不胜感激。
【问题讨论】: