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的。当然,可以通过手动使用拆分和一组连接和拼接来实现。但是仅仅分割是远远不够的。很好,那就是我在寻找一件小事(但我也会对当前的解决方案感到高兴):我重新锐化负面测试用例。这就是我在寻找一件小事(但我也会对当前的解决方案感到高兴):我重新锐化负面测试用例