我不明白为什么这两个表达式不同:
^(\d+)(?:\.(\d+))?(?:\.(\d+))?$
applied to 1.0.3
group 1 =>1
group 2 =>0
group 3 =>3
这是预期的。但如果我尝试将其推广到任何一系列 \d\.
那么它就不再起作用了:
^(\d+)(?:\.(\d+))+$
applied to 1.0.3
group 1 =>1
group 2 =>3
对我来说很奇怪,除了第一个和最后一个条目之外的所有内容都消失了:
^(\d+)(?:\.(\d+))+$
applied to 1.2.3.4.5.6.7.8.9
group 1 =>1
group 2 =>9
不完全符合我的预期
最佳答案
尝试以下正则表达式,它捕获至少包含一位数字的所有数字并将它们放置到单独的组中:
(?<=^|\.)(\d+)(?=\.|$)
它的工作原理很简单。让我们描述一下正则表达式的各个部分:
-
(?<=^|\.)
是正向后检查数字\d+
跟随点.
字符(注意必须转义\.
,否则表示任何字符)或行的开头^
. -
\d+
是要捕获的数字 -
(?=\.|$)
是正向前瞻检查数字是否\d+
后面跟着点.
或行尾$
。
尝试一下 Regex101哪里有更详细的解释。
关于java - 正则表达式非捕获和捕获组以及无法解释的消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39495166/