C# 正则表达式:保留所有捕获,而不仅仅是最后一次重复

C# 正则表达式:保留所有捕获,而不仅仅是最后一次重复,c#,.net,regex,C#,.net,Regex,我有一个C#regex问题。解决方案可能很简单,但我现在无法让它工作 string type = "ARRAY [0..10,0..20,1..2] OF INT"; Regex regex = new Regex(@"^ARRAY \[(?:(\d+)\.\.(\d+),?)+\]"); var matches = regex.Matches(type); 此代码仅捕获“1”和“2”,这是数组最后一个维度的边界。我需要捕获所有维度,最好是嵌套格式{0,10}、{0,20}、{1,2},但是由

我有一个C#regex问题。解决方案可能很简单,但我现在无法让它工作

string type = "ARRAY [0..10,0..20,1..2] OF INT";
Regex regex = new Regex(@"^ARRAY \[(?:(\d+)\.\.(\d+),?)+\]");
var matches = regex.Matches(type);

此代码仅捕获“1”和“2”,这是数组最后一个维度的边界。我需要捕获所有维度,最好是嵌套格式{0,10}、{0,20}、{1,2},但是由于每个维度总是有两个捕获,平面格式{0,10,0,20,1,2}也可以

match.Group[1]
.捕获
.Cast()
.Select(capture=>int.Parse(capture.Value))
.Zip(匹配组[2]
.捕获
.Cast()
.Select(capture=>int.Parse(capture.Value)),
(最小值,最大值)=>新的{min,max})
每个组公开一组
Capture
s,其中包含所有匹配的实例


match.Group[1]。捕获
包含所有最小值,而
match.Group[2]。捕获
包含所有最大值。上面的代码只是将它们拉到一起,以生成所需的输出。

您已经在匹配数据中找到了它,在:

match.Group[1]
.捕获
.Cast()
.Select(capture=>int.Parse(capture.Value))
.Zip(匹配组[2]
.捕获
.Cast()
.Select(capture=>int.Parse(capture.Value)),
(最小值,最大值)=>新的{min,max})
每个组公开一组
Capture
s,其中包含所有匹配的实例


match.Group[1]。捕获
包含所有最小值,而
match.Group[2]。捕获
包含所有最大值。上面的代码简单地将它们压缩在一起,以生成所需的输出。

\G
在上一个匹配的末尾或第一个匹配的字符串的开头断言位置

(?:^ARRAY \[|\G),?(\d+)\.\.(\d+)

\G
在上一个匹配的末尾或第一个匹配的字符串的开头断言位置

(?:^ARRAY \[|\G),?(\d+)\.\.(\d+)

这捕获了三个部分“0..10”、“0..20”和“1..2”,但我宁愿单独捕获边界以简化int.Parse()部分。好的,我不确定是否可以在C中使用look behind,但如果可以,您只想匹配边界,类似于
(?这捕获了三个部分“0..10”、“0..20”和“1..2”),但我宁愿单独捕获边界以简化int.Parse()部分。好的,我不确定是否可以在C#中使用look behind,但如果可以,您只想匹配边界,比如
(?
Regex regex = new Regex(@"^ARRAY \[([\d]+[.]{2}[\d]+[,]?)+\]")