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

时间:2014-11-27 16:19:51

标签: c# .net regex

我有C#正则表达式问题。解决方案可能非常简单,但我现在无法让它工作。

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}也会这样做。

3 个答案:

答案 0 :(得分:2)

您已在Captures中的匹配数据中找到它:

match.Group[1]
     .Captures
     .Cast<Capture>()
     .Select(capture => int.Parse(capture.Value))
     .Zip(match.Group[2]
               .Captures
               .Cast<Capture>()
               .Select(capture => int.Parse(capture.Value)),
         (min, max) => new { min, max })

每个组都会公开一个Capture的集合,其中包含所有匹配的实例。

match.Group[1].Captures包含所有 min 值,而match.Group[2].Captures包含所有 max 值。上面的代码只是将它们拉在一起以产生您需要的输出。

答案 1 :(得分:2)

\G断言上一场比赛结束时的位置或第一场比赛的字符串开头。

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

DEMO

答案 2 :(得分:0)

Regex regex = new Regex(@"^ARRAY \[([\d]+[.]{2}[\d]+[,]?)+\]")