Java 如何修复我的正则表达式以使参数3保留在捕获组3中?

Java 如何修复我的正则表达式以使参数3保留在捕获组3中?,java,regex,regex-group,Java,Regex,Regex Group,我有以下正则表达式: ^(\d*)(?:\.)(\d*)(?:|(?:\.)(\d*))(?:|(?:\.)([a-zA-Z0-9_-]*))?$ 你可以测试一下。 我想使用它将版本号解析为组,例如,其中g1是组号1,依此类推: 1.2 => g1(1),g2(2) 1.2.3 => g1(1),g2(2),g3(3) 1.2.3.4_or_text => g1(1),g2(2),g3(3),g4(4_o

我有以下正则表达式:

^(\d*)(?:\.)(\d*)(?:|(?:\.)(\d*))(?:|(?:\.)([a-zA-Z0-9_-]*))?$
你可以测试一下。 我想使用它将版本号解析为组,例如,其中g1是组号1,依此类推:

1.2              =>  g1(1),g2(2)    
1.2.3            =>  g1(1),g2(2),g3(3)    
1.2.3.4_or_text  =>  g1(1),g2(2),g3(3),g4(4_or_text)  
这几乎可以工作,除非第三组是可选的,如果版本有3个部分,则跳到第四组。 因此,实际发生的情况是:

1.2              =>  g1(1),g2(2)    
1.2.3            =>  g1(1),g2(2),g3(),g4(3)           <-- I want to fix this
1.2.3.4_or_text  =>  g1(1),g2(2),g3(3),g4(4_or_text) 
我不能确定我做错了什么

它现在的工作方式也意味着以下内容是有效的:
1.2.3_或_文本由于被解析为g11、g22、g3、g43_或_文本

您可以将此正则表达式与两个可选的非捕获组一起使用:

^(\d+)\.(\d+)(?:\.(\d+)(?:\.([\w-]+))?)?$
详情:

^`:开始 \d+:匹配并捕获捕获组1中的1+个数字 \匹配一个字面值。 \d+:匹配并捕获捕获组2中的1+个数字 ?:启动非捕获组1 \匹配一个字面值。 \d+:匹配并捕获捕获组3中的1+个数字 ?::启动非捕获组2 \匹配一个字面值。 [\w-]+:匹配并捕获捕获组4中的1+个单词或连字符 ?:结束非捕获组2可选 ?:结束非捕获组1可选 $:完 您在正则表达式中有额外的交替表达式

^(\d*)(?:\.)(\d*)(?:|(?:\.)(\d*))(?:|(?:\.)([a-zA-Z0-9_-]*))?$
                    ^               ^
                   this            this
它告诉我们不要匹配总是经过的任何东西。因此,你的第二部分交替永远不会匹配

进一步解释:交替语法如下

(?:a|b|c)
在你的情况下,a什么都不是,这就是为什么它总是正确的,并且匹配

正确的解决方案:您还缺少可选组,并且假设至少有一个数字或字母,则应为正确的正则表达式

^(\d+)(?:\.)(\d+)(?:(?:\.)(\d+))?(?:(?:\.)([a-zA-Z0-9_-]+))?$
正则表达式分解


拆分字符串而不是正则表达式不是更容易吗?是的,但现在我想知道-
^(\d+)[.](\d+)(?:[.](\d+)(?:[.]([\w-]+))?)?$
^ #Start of string
 (\d+)[.] #Match digit and dot
 (\d+) #Match next group

 (?: #Non-capturing group
   [.](\d+) #Match dot and digit
   (?:[.]([\w-]+))? #Match dot and digit. This is optional
 )? #Third and Fourth match can be optional

$ #End of string