用正则表达式细分版本号

时间:2018-11-30 07:07:40

标签: regex perl

我有一个正则表达式可以满足我的需求:

我想将一些版本号分成不同的部分。 预期结果是:

/^(?<curBranch>(?<baseBranch>(?:\d+\.\d+\.)*?)?\d+\.)(?<curRevision>\d+)$/

表达式

                      baseBranch           curBranch           curRevision
1.36.1.5                1.36.                1.36.1.             5
1.31                    <empty>              1.                  31
1.14.2.21.1.16.1.13     1.14.2.21.1.16.      1.14.2.21.1.16.1.   13
1.31.34                 <no match (illegal number - always have to be pairs)>
1.31.34.2.4             <no match (illegal number - always have to be pairs)>
1.31.34.2.4.4.5         <no match (illegal number - always have to be pairs)>

表达式几乎可以完成它的工作,但我无法摆脱baseBranch字段的最后一个点(打算在curBranch处使用该点)

当前输出如下

curl -X POST "https://<user>:<APItoken>@<jenkinsurl>/credentials/store/system/domain/_/credential/<credetntial>/doDelete"

在线测试链接: https://regex101.com/r/0aU07q/3

注意:
否定情况很好-它们不应该出现在数据中

2 个答案:

答案 0 :(得分:1)

您可以使用点分隔字符串

并加入。

my @v=split /\./,$versionstr;

return if (scalar @array) <4;

更多...

答案 1 :(得分:1)

您需要对捕获的分组方式进行一些更改。您需要从baseBranch组中取出点(当然),并且需要将您的分支基础组更改为此正则表达式,

(?<baseBranch>\d+(?:\.\d+)+)

基本上会捕获第一个数字,然后递归地期望\.\d+形式的数据为一个或多个。

修改后的所有正则表达式都将变为

^(?<curBranch>(?:(?<baseBranch>\d+(?:\.\d+)+)\.)?\d+\.)(?<curRevision>\d+)$

Demo

让我知道这是否是您所需要的。如果是的话,请告诉我是否要我进一步为该正则表达式添加说明。

编辑:用于更严格的阴性测试用例

您可以使用此正则表达式来匹配您的新情况,仅当baseBranch组的点号为偶数(包括0,例如2、4、6等)时,该正则表达式才匹配。

^(?<curBranch>(?:(?<baseBranch>\d+\.\d+(?:(?:\.\d+){2})*)\.)?\d+\.)(?<curRevision>\d+)$

如果整个输入具有偶数个点分隔数字,则此正则表达式将匹配。因此,这些将匹配,

1.36.1.5
1.31
1.14.2.21.1.16.1.13
1.31.34.2.4.4.5.6

但是这些不匹配,因为它们是奇数个数字

1.31.34
1.31.34.2.4
1.31.34.2.4.4.5

Demo for updated and better regex