有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

用于捕获键/值的java正则表达式

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

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

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

可以用正则表达式实现吗

谢谢


共 (3) 个答案

  1. # 1 楼答案

    这可能需要一些清理,我不经常使用正则表达式,也从来没有在Java中使用过

    尝试使用正则表达式:

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

    也就是说:找到一个等于“{”或“,”的字符,然后找到不是“,”}或“,”的无限字符,直到找到一个等于“}”或“,”的字符

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

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

    然后把它放回日志的正确位置。完成所有操作后,可以使用JSON读取日志

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

  2. # 2 楼答案

    可以逐行读取输出,直到使用String.equals()找到“{memory”。 接下来你可以做

        String[] result = line.replaceAll("[\\[\\]}{ \t]|},", "").split(",");
        System.out.println(result[0] + "," + result[1]);
        if(line.contains("]"))
            break;
    
  3. # 3 楼答案

    我不确定这是否是您想要的,但因为您说过需要存储第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
    ...