正则表达式非捕获和捕获组以及无法解释的消耗

regex non-capturing and capturing groups and unexplained consumption

我不明白为什么这两个表达式不同:

^(\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 试试看,哪里有更详细的解释。