正则表达式产生一个不正确的结果

Regex producing one incorrect result

我对一个特定的正则表达式感到困惑(我非常接近,但还不能克服最后一个障碍。

我需要从名称略有不同的 git 分支系列中提取分支类型和 "initiative"。分支类型进入第 1 组,倡议进入第 2 组。版本以 "v" 开头或根本没有。

想要的 Inputs/Outputs 是:

branchname          | group 1 | group 2
release/v1.2.3      | release | ""      
release/1.2.3       | release | ""
release/foo-v1.2.3  | release | foo
release/foo-1.2.3   | release | foo

我当前的正则表达式是:(release)\/(\w*)-?(?=v?\d+\.\d+\.\d*)

这会产生以下 Inputs/Outputs:

branchname          | group 1 | group 2
release/v1.2.3      | release | "v"      <--- Problem!
release/1.2.3       | release | ""
release/foo-v1.2.3  | release | foo
release/foo-1.2.3   | release | foo

我的问题是我只有 v1.2.3。如果可以的话,我不想返回并更改分支名称(由于很久以前的决定,我们有很多名称为 release/vX.Y.Z 的分支)。

我在 Linux 系统上使用 Ant 来处理这个正则表达式,所以我相信我需要遵循 Java 规则。

谢谢!

超级接近!尝试将 ? 附加到第二个匹配组,如下所示:

(release)\/(\w*?)-?(?=v?\d+\.\d+\.\d*)

See this working in regexr.

您最好将可选 属性 应用于整个 \w+- 模式:

(release)\/(?:(\w+)-)?v?\d+(?:\.\d+)*

看来你也不需要前瞻。