我无法理解这两个表达式为何不同的原因:

^(\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处进行尝试,其中有更详细的说明。

10-07 12:41
查看更多