使用java进行纯文本解析

时间:2012-11-23 12:06:40

标签: java

我有ssh的输出,如下所示。我想使用java将下面的输出解析为hashmap。任何建议都有帮助...

Name        : mysql                        Relocations: (not relocatable)
Version     : 5.1.61                            Vendor: CentOS
Release     : 4.el6                         Build Date: Fri 22 Jun 2012 05:58:59 AM PDT
Install Date: Tue 13 Nov 2012 02:23:23 AM PST      Build Host: c6b10.bsys.dev.centos.org
URL         : http://www.mysql.com
Summary     : MySQL client programs and shared libraries

我的输出应该是像

这样的散列图

键值

命名mysql

重新安置(不可重新定位)

版本5.1.61

发布4.el6

3 个答案:

答案 0 :(得分:3)

正则表达式应该可以解决这个问题:

public static void main(String[] args) {
    StringBuilder sb = new StringBuilder();
    sb.append("Name        : mysql                        Relocations: (not relocatable)\n");
    sb.append("Version     : 5.1.61                            Vendor: CentOS\n");
    sb.append("Release     : 4.el6                         Build Date: Fri 22 Jun 2012 05:58:59 AM PDT\n");
    sb.append("Install Date: Tue 13 Nov 2012 02:23:23 AM PST      Build Host: c6b10.bsys.dev.centos.org\n");
    sb.append("URL         : http://www.mysql.com\n");
    sb.append("Summary     : MySQL client programs and shared libraries\n");

    Pattern p = Pattern.compile("([^\\r\\n:]+):\\s(.+?)(\\s{2,}|\\r\\n|\\r|\\n|$)");
    Matcher m = p.matcher(sb.toString());
    while(m.find()) {
        String key = m.group(1).trim();
        String value = m.group(2);

        System.out.println(key + " = \"" + value + "\"");
    }
}

输出:

Name = "mysql"
Relocations = "(not relocatable)"
Version = "5.1.61"
Vendor = "CentOS"
Release = "4.el6"
Build Date = "Fri 22 Jun 2012 05:58:59 AM PDT"
Install Date = "Tue 13 Nov 2012 02:23:23 AM PST"
Build Host = "c6b10.bsys.dev.centos.org"
URL = "http://www.mysql.com"
Summary = "MySQL client programs and shared libraries"

答案 1 :(得分:1)

试试这个正则表达式作为起点:

([a-zA-Z][a-zA-Z ]*): (.*?)(( {2,})|$)

第一组应该捕获键,第二组应该捕获值。它假设有两件事:

1)在值之后至少有两个空格或行的结尾。 2)在一个值中一个接一个地没有两个空格。

(重要的是这些假设确实如此。在你的例子中它们是正确的,但你需要验证输入总是正确的。)

我针对您上面的示例对其进行了测试,似乎有效,请尝试:http://regexpal.com/(您需要在顶部启用复选框“^ $ match at line break”以使其正常工作)

如果该正则表达式正常,请使用Java API中的PatternMatcher来构建您的hashmap。啊,你应该trim()你匹配的键和值来消除末尾的额外空格。

答案 2 :(得分:0)

尝试创建一些正则表达式。由于许多项目定义得很好,您可以使用String.indexOf()来捕获起点和终点。然后获取substring(),并开发hashmap。