我正在编写一个程序,我需要读取一个文本文件并提取一些特定的字符串,该文本是用DOT语言编写的,这是该文件的一个示例:
digraph G {
node [shape=circle];
0 [xlabel="[]"];
1 [xlabel="[[Text]]"];
0 -> 1 [label="a"];//this
1 -> 2 [label="ab"];//this
1 -> 3 [label="123"];//this
}
我想忽略除了具有注释行结构的行(//this
)之外的所有内容;
然后将每一行分成三部分,即:
1 -> 2 [label="ab"];
保存为字符串列表(或数组...):
[1,2,ab]
我尝试了很多regex
,但我无法获得预期的结果。
答案 0 :(得分:1)
如果您确保该行的格式始终为a -> b [label="someLabel"];
,那么我猜您可以使用一堆分割来获得所需内容:
if (outputLine.contains("[label=")) {
String[] split1 = outputLine.split("->");
String first = split1[0].replace(" ", ""); // value of 1
String[] split2 = split1[1].split("\\[label=\"");
String second = split2[0].replace(" ", ""); // value of 2
String label = split2[1].replace("\"", "").replace(" ", "").replace("]", "").replace(";", ""); // just the label
String[] finalArray = {first, second, label};
System.out.println(Arrays.toString(finalArray)); // [1, 2, ab]
}
似乎笨重。可能是一种更好的方法。
答案 1 :(得分:1)
以下是您可以使用的正则表达式:
(?m)^(\d+)\s+->\s+(\d+)\s+\[\w+="([^"]*)"];\s*//[^/\n]*$
请参阅regex demo。
所有必要的细节都在第1组,第2组和第3组中进行。
请参阅Java code:
String str = "digraph G {\nnode [shape=circle];\n0 [xlabel=\"[]\"];\n1 [xlabel=\"[[Text]]\"];\n0 -> 1 [label=\"a\"];//this\n1 -> 2 [label=\"ab\"];//this\n1 -> 3 [label=\"123\"];//this\n}";
Pattern ptrn = Pattern.compile("(?m)^(\\d+)\\s+->\\s+(\\d+)\\s+\\[\\w+=\"([^\"]*)\"\\];\\s*//[^/\n]*$");
Matcher m = ptrn.matcher(str);
ArrayList<String[]> results = new ArrayList<String[]>();
while (m.find()) {
results.add(new String[]{m.group(1), m.group(2), m.group(3)});
}
for(int i = 0; i < results.size(); i++) { // Display results
System.out.println(Arrays.toString(results.get(i)));
}