我用逗号分隔输入的图形,每个图形输入以大括号()开头和结尾。大括号之间是设置形式的顶点和边缘的详细信息,如下所示
({A,B,C},{(A,B),(B,C),(C,A)}),({A,B,C,D,E},{(A,B),(B,C),(C,A),(E,D),(D,A)})
此输入字符串包含两个图形:({V1,..} {(E1),..}),({V2,..} {(E2),..}),..
{A,B,C},{(A,B),(B,C),(C,A)}
{A,B,C,D,E},{(A,B),(B,C),(C,A),(E,D),(D,A)}
是否有正则表达式来解析这个没有太多的boilar板代码......?
答案 0 :(得分:2)
您可以使用while(matcher.find())
循环来匹配输入中所有出现的图形,将匹配解析为顶点和边缘,非常容易。
String data = "({A,B,C},{(A,B),(B,C),(C,A)}),({A,B,C,D,E},{(A,B),(B,C),(C,A),(E,D),(D,A)})";
Pattern pattern = Pattern.compile("\\(\\{([^}]+)\\},\\{([^}]+)\\}\\)");
Matcher matcher = pattern.matcher(data);
while (matcher.find()) {
System.out.println("Graph vertices=" + matcher.group(1));
System.out.println(" edges=" + matcher.group(2));
}
输出:
Graph vertices=A,B,C
edges=(A,B),(B,C),(C,A)
Graph vertices=A,B,C,D,E
edges=(A,B),(B,C),(C,A),(E,D),(D,A)
正则表达式细节:
"\(\{([^}]+)\},\{([^}]+)\}\)"
- 在\\
到\
来源翻译后的表达
"\(\{ \},\{ \}\)"
- 匹配文字({ },{ })
字符
" ( ) ( ) "
- 捕获群组1& 2
" [^}]+ [^}]+ "
- 匹配1个或多个非}
字符
matcher.find()
将找到并捕获第一个匹配,然后是后续匹配,最后返回false
,此时无法找到更多匹配项。
可以以类似的方式完成顶点和边缘数据的解析。留给学生。