正则表达式非捕获和捕获组以及无法解释的消耗
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 试试看,哪里有更详细的解释。
我不明白为什么这两个表达式不同:
^(\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 试试看,哪里有更详细的解释。