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

标签 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

不完全符合我的预期

最佳答案

尝试以下正则表达式,它捕获至少包含一位数字的所有数字并将它们放置到单独的组中:

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

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

  • (?<=^|\.)是正向后检查数字 \d+跟随点 .字符(注意必须转义 \. ,否则表示任何字符)或行的开头 ^ .
  • \d+是要捕获的数字
  • (?=\.|$)是正向前瞻检查数字是否 \d+后面跟着点 .或行尾$

尝试一下 Regex101哪里有更详细的解释。

关于java - 正则表达式非捕获和捕获组以及无法解释的消耗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39495166/

相关文章:

java - SpringBoot无法基于JSON创建类的实例

java - 改进通用 SeekBar 示例

regex - Vim 正则表达式捕获组 [bau -> byau : ceu -> cyeu]

python - Pandas `str.extract()` 中带有捕获组的正则表达式的预期行为

java - 提高核心 Java 生产力的前 3 个库是什么?

java - 一起编程时,java arrayoutofbounds异常错误

c# - 捕获可变长度的子串引用号

python - 使用 python re 编辑文本文件

java - 删除除与正则表达式 java 匹配的内容之外的所有文本

java - 正则表达式捕获符号前后的数字