【问题标题】:Extracting optional version components with JQ regex使用 JQ 正则表达式提取可选版本组件
【发布时间】:2023-01-16 15:38:15
【问题描述】:

我正在尝试定义一个正则表达式,以从可能已使用不同版本控制方案格式化的字符串中提取版本控制信息。

例子:

v2.234324
4.5.0
v1.1.0-bar
v2.3-foo
V1
FEE-v1.0.2-fuu

我可以通过考虑以下要素来“概括”这些版本控制方案:

  • 可选的兼容性前缀
  • 一个可选的vV
  • 最多 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

如果能帮助我理解为什么我的尝试不起作用以及应该怎么做,我将不胜感激。

【问题讨论】:

    标签: regex jq


    【解决方案1】:

    尝试将 patch 移动到 minor 的捕获组中,如下所示:

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

    Online demo

    【讨论】:

      猜你喜欢
      • 2016-12-22
      • 2021-11-05
      • 2022-10-01
      • 1970-01-01
      • 1970-01-01
      • 2021-12-12
      • 2010-11-04
      • 2013-09-09
      相关资源
      最近更新 更多