我有一个正则表达式可以满足我的需求:
我想将一些版本号分成不同的部分。 预期结果是:
/^(?<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
注意:
否定情况很好-它们不应该出现在数据中
答案 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+)$
让我知道这是否是您所需要的。如果是的话,请告诉我是否要我进一步为该正则表达式添加说明。
编辑:用于更严格的阴性测试用例
您可以使用此正则表达式来匹配您的新情况,仅当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