如何以嵌套括号递归解析逗号分隔的字符串

时间:2016-12-31 20:37:23

标签: java regex parsing

我用逗号分隔输入的图形,每个图形输入以大括号()开头和结尾。大括号之间是设置形式的顶点和边缘的详细信息,如下所示

({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板代码......?

1 个答案:

答案 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,此时无法找到更多匹配项。

可以以类似的方式完成顶点和边缘数据的解析。留给学生。