从 Dijkstra 算法 C# 的点符号输入解析图形

Parsing a graph from a dot notation input for Dijkstra's Algorithm C#

我正在尝试从文本文件中读取图形并对其进行解析,以便能够提取用于 Dijkstra 算法实现的顶点、边和权重。

文本文件包含以下结构:

graph {
    a -- b[label="5",weight="5"];
    a -- c[label="1",weight="1"];
    c -- b[label="3",weight="3"];
    c -- e[label="1",weight="1"];
    e -- b[label="1",weight="1"];
}

发现很难使用 .split,因为数据不是由相同的分隔符分隔的。

我需要从第一行中提取例如: a 需要设置为 from。 b 需要设置为 并且 5 需要设置为 weight

请问我如何解决这个问题?

我们可以使用这个正则表达式轻松提取值:

(\w+) -- (\w+)\[label="(\w+)",weight="([0-9]*\.?[0-9]+)"\];

完整代码:

string rawData = File.ReadAllText("H:\data.txt");
string pattern = "(\w+) -- (\w+)\[label=\"(\w+)\",weight=\"([0-9]*\.?[0-9]+)\"\];";
var matches = Regex.Matches(rawData, pattern);

编辑: 以下是我们如何从每个匹配对象中获取不同的值

定义一个 Edge class 只是为了保存数据

class Edge {
    public string NodeALabel;
    public string NodeBLabel;
    public double Weight;
    public string EdgeLabel;
}

从每场比赛中获取组值。分组号由分组左侧有多少个左括号决定。

var edgeList = matches.Select(match => new Edge() {
    NodeALabel= match.Groups[1].Value,
    NodeBLabel= match.Groups[2].Value,
    Weight= double.Parse(match.Groups[4].Value),
    EdgeLabel= match.Groups[3].Value
}).ToList();