正则表达式非捕获和捕获组和不明原因的消费

时间:2016-09-14 16:11:57

标签: java regex capturing-group

我无法理解为什么这两个表达式不同:

^(\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

不完全是我所期待的

1 个答案:

答案 0 :(得分:0)

尝试使用以下正则表达式,它捕获至少有一位数的所有数字并将它们放在分开的组中:

(?<=^|\.)(\d+)(?=\.|$)

它很简单。让我们描述一下正则表达式的各个部分:

    如果数字(?<=^|\.)跟在点\d+字符后面,那么
  • .是正向后检查(注意必须转义为\.,否则表示任何字符)或第^行的开头。
  • \d+是要捕获的号码
  • (?=\.|$)是一个积极的先行,检查数字\d+后面是点.还是行$的结尾。

Regex101处尝试一下,更详细的解释。