1

我有一个命令的输出,它基本上列出了其中的一堆键/值对。输出没有明显的格式,因此我认为正则表达式将是最好的方法。

输出: http: //pastebin.com/Hfu4nP3M

基本上,我需要从第 21-30 行存储键/值对(逗号分隔)并将它们存储在地图中。

是否可以使用正则表达式来做到这一点?

谢谢。

4

3 回答 3

1

我不确定这是否是您想要的,但既然您说您需要存储第 21-30 行中的键/值对(逗号分隔),它们是

 {memory,
     [{total,38751504},
      {processes,13711212},
      {processes_used,13711198},
      {system,25040292},
      {atom,662409},
      {atom_used,653371},
      {binary,287088},
      {code,18209655},
      {ets,1358504}]},

我假设你想读取memory存储在里面的值[...]

为此,您可以使用类似

//creating reader to get data from file
BufferedReader in = new BufferedReader(new InputStreamReader(
        new FileInputStream("data.txt")));// file with your data

StringBuilder sb = new StringBuilder();
String line = null;
while ((line = in.readLine()) != null) {
    sb.append(line.trim());// also remove unnecessary tabulators and
                            // spaces
}
in.close();

String data = sb.toString();

Pattern pattern = Pattern.compile("\\{memory,\\[(.*?)\\]");
Matcher m = pattern.matcher(data);
if (m.find()) {
    Pattern keyValuePattern = Pattern.compile("\\{(\\w*?),(\\d*?)\\}");
    Matcher matcher = keyValuePattern.matcher(m.group(1));
    while (matcher.find())
        System.out.println(matcher.group(1) + "->" + matcher.group(2));
} else
    System.out.println("not found");

输出

total->38751504
processes->13711212
...
于 2012-08-08T14:32:36.850 回答
0

这可能需要一些清理——我不经常使用正则表达式,也从不使用 Java。

尝试使用正则表达式:

[{,][^",}]*?[,}]

即:找到等于'{'或','的字符,然后找到不是'"'、'}'或','的无限字符,直到找到等于'}'或','的字符为止。

要查找尚未用引号标记的所有内容,请将其匹配。

String s = p.match();
s = s.charAt(0) + '"' + s.substring(1, s.length() - 1) + '"' + s.charAt(s.length() - 1;

然后将其放回日志中的正确位置。完成所有这些后,您可以使用 JSON 读取日志。

此外,您可能希望将日志保存在内存中,这样操作起来会更容易。

于 2012-08-08T13:38:50.597 回答
0

您可以逐行读取输出,直到使用 String.equals() 找到 '{memory' 是可以的。然后在以下所有行中,您可以执行

    String[] result = line.replaceAll("[\\[\\]}{ \t]|},", "").split(",");
    System.out.println(result[0] + "," + result[1]);
    if(line.contains("]"))
        break;
于 2012-08-08T13:46:42.130 回答