Regex 使用正则表达式细分版本号

Regex 使用正则表达式细分版本号,regex,perl,Regex,Perl,我有一个几乎符合我需要的正则表达式: 我想把一些版本号分成不同的部分。 预期结果是: baseBranch curBranch curRevision 1.36.1.5 1.36 1.36.1. 5 1.31 <empty> 1.

我有一个几乎符合我需要的正则表达式:

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

                      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路边牧场curRevision
1.36.1.5                1.36                 1.36.1.             5.
1.31                                  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                 
1.31.34.2.4             
1.31.34.2.4.4.5         
表情

/^(?<curBranch>(?<baseBranch>(?:\d+\.\d+\.)*?)?\d+\.)(?<curRevision>\d+)$/
/^(?((?:\d+\。\d+\)*?)?\d+\(?\d+)$/
表达式几乎完成了它应该做的,但我无法去掉baseBranch字段的最后一个点(路边牧场的点是预期的)

目前,输出如下所示

                      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路边牧场curRevision
1.36.1.5                1.36.                1.36.1.             5.
1.31                                  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                 
1.31.34.2.4             
1.31.34.2.4.4.5         
用于在线测试的链接:

注:
负数大小写很好-它们不应该出现在数据中

您可以使用点分割字符串 加入它
my@v=split/\./,$versionstr;
如果(标量@数组)可以使用点拆分字符串,则返回
加入它
my@v=split/\./,$versionstr;

如果(scalar@array)您需要对捕获的分组方式进行一些更改,则返回。您需要从baseBranch组中去掉点(当然),并需要将您的分支基本组更改为此正则表达式

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

如果这是你需要的,请告诉我。如果是的话,如果你想让我进一步解释这个正则表达式,请告诉我

编辑:用于锐化的阴性测试用例

您可以使用此正则表达式来匹配您的新案例,这将仅在BaseBrange组具有点分隔数字的偶数(包括0,如2、4、6等)时匹配

^(?<curBranch>(?:(?<baseBranch>\d+\.\d+(?:(?:\.\d+){2})*)\.)?\d+\.)(?<curRevision>\d+)$
但这些不匹配,因为它们是奇数

1.31.34
1.31.34.2.4
1.31.34.2.4.4.5

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

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

如果这是你需要的,请告诉我。如果是的话,如果你想让我进一步解释这个正则表达式,请告诉我

编辑:用于锐化的阴性测试用例

您可以使用此正则表达式来匹配您的新案例,这将仅在BaseBrange组具有点分隔数字的偶数(包括0,如2、4、6等)时匹配

^(?<curBranch>(?:(?<baseBranch>\d+\.\d+(?:(?:\.\d+){2})*)\.)?\d+\.)(?<curRevision>\d+)$
但这些不匹配,因为它们是奇数

1.31.34
1.31.34.2.4
1.31.34.2.4.4.5

您可以通过单独的组生成分支/值:
^((\d+)\(\d+))((?:\.\d+.\d+)*(\.(\d+)))*$
您可以通过单独的组生成分支/值:
^(\d+)((?:\.\d+.\d+)*(\.(\.(\d+)))*(\.(\d+))*$)。
。是关于regex的。当然,可以通过手动使用拆分和一组连接和拼接来实现。但仅仅分裂是远远不够的。答案与问题有点无关。是关于regex的。当然,可以通过手动使用拆分和一组连接和拼接来实现。但是仅仅分割是远远不够的。很好,那就是我在寻找一件小事(但我也会对当前的解决方案感到高兴):我重新锐化负面测试用例。这就是我在寻找一件小事(但我也会对当前的解决方案感到高兴):我重新锐化负面测试用例