我有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
答案 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中的Pattern
和Matcher
来构建您的hashmap。啊,你应该trim()
你匹配的键和值来消除末尾的额外空格。
答案 2 :(得分:0)
尝试创建一些正则表达式。由于许多项目定义得很好,您可以使用String.indexOf()
来捕获起点和终点。然后获取substring()
,并开发hashmap。