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