【问题标题】:regex non-capturing and capturing groups and unexplained consumption正则表达式非捕获和捕获组和无法解释的消费
【发布时间】:2017-01-22 12:55:54
【问题描述】:

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

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

不完全是我所期待的

【问题讨论】:

  • 第二个捕获组中只有最后一个匹配的文本可用。组不是动态的,无论您定义多少组,您都会在匹配结果中获得。
  • 重复捕获组的行为如下。

标签: java regex capturing-group


【解决方案1】:

试试下面的正则表达式,它捕获所有至少有一位数字的数字并将它们放在不同的组中:

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

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

  • (?&lt;=^|\.) 是积极的后向检查,如果数字 \d+ 跟在点 . 字符之后(注意必须转义 \.,否则它表示任何字符)或行首 ^。李>
  • \d+ 是要捕获的数字
  • (?=\.|$) 是正向前瞻检查数字 \d+ 后跟点 . 还是行尾 $

Regex101 尝试一下,那里有更详细的说明。

【讨论】:

  • 谢谢,不知何故,我不知道捕获不是动态的组,正如 anubhava 提到的那样。您的解决方案显示了获取这些值的其他方式。
  • 最后不用+?(?&lt;=^|\.)\d+(?=\.|$)就够了。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-08
  • 1970-01-01
  • 1970-01-01
  • 2015-06-21
相关资源
最近更新 更多