C#中的迭代正则表达式捕获

Wil*_*sem 4 c# regex recursion capturing-group

我必须读入包含许多坐标的文件.该文件的结构如下:

X1/Y1,X2/Y2,X3/Y3,X4/Y4
Run Code Online (Sandbox Code Playgroud)

其中X和Y是正整数.为了解决这个问题,我想使用正则表达式(我认为这通常是一个好主意,因为模式更改时的重构最少).

因此我开发了以下正则表达式:

Regex r = new Regex(@^(?<Coor>(?<X>[0-9]+)/(?<Y>[0-9]+))(,(?<Coor>(?<X>[0-9]+)/(?<Y>[0-9]+)))*$");
Run Code Online (Sandbox Code Playgroud)

但是当我在数据上测试这个正则表达式时,例如:

1302/1425,1917/2010
Run Code Online (Sandbox Code Playgroud)

正则表达式似乎只记得最后一个X,Y和Coor组.在这种情况下,Coor是"12/17",X是"1917",Y是"2010".有没有办法生成某种树.所以我找到了一个给我所有Coor表达式的对象,每个Coor下有一个X和Y组件?

如果可能的话,我只想使用一个正则表达式,这是因为格式可能会改为另一个.

Mar*_*ers 5

你可以很容易地解决这个问题,而不使用任何正则表达式string.Splitint.Parse:

var coords = s.Split(',')
    .Select(x => x.Split('/'))
    .Select(a => new {
        X = int.Parse(a[0]),
        Y = int.Parse(a[1])
    });
Run Code Online (Sandbox Code Playgroud)

如果你想使用正则表达式来验证字符串,你可以这样做:

"^(?!,)(?:(?:^|,)[0-9]+/[0-9]+)*$"
Run Code Online (Sandbox Code Playgroud)

如果您还想使用基于正则表达式的方法来提取数据,您可以首先使用上面的正则表达式验证字符串,然后按如下方式添加数据:

var coords = Regex.Matches(s, "([0-9]+)/([0-9]+)")
    .Cast<Match>()
    .Select(match => new
    {
        X = int.Parse(match.Groups[1].Value),
        Y = int.Parse(match.Groups[2].Value)
    });
Run Code Online (Sandbox Code Playgroud)

如果您确实希望使用单个正则表达式同时执行验证和数据提取,则可以使用两个捕获组并在Captures每个组的属性中查找结果.这是使用单个正则表达式执行验证和数据提取的一种方法:

List<Group> groups =
    Regex.Matches(s, "^(?!,)(?:(?:^|,)([0-9]+)/([0-9]+))*$")
         .Cast<Match>().First()
         .Groups.Cast<Group>().Skip(1)
         .ToList();

var coords = Enumerable.Range(0, groups[0].Captures.Count)
    .Select(i => new
    {
        X = int.Parse(groups[0].Captures[i]),
        Y = int.Parse(groups[1].Captures[i])
    });
Run Code Online (Sandbox Code Playgroud)

但是,您可能需要考虑与string.Split基于解决方案相比,此解决方案的复杂性是否值得.