在java中解析这个字符串的最佳方法是什么?
Admin State State Type Interface Name
-------------------------------------------------------------------------
Enabled Connected Dedicated Local Area Connection
Enabled Connected Dedicated Local Area Connection 2
每个单词之间是空格,不是制表符,不是任何其他东西,因为你可以看到空格的数量不相等,而且在“局部区域连接”之类的单词之间也是空格。
实际上我想要所有网络接口的名称和它们的状态。 这是windows中“netsh”命令的输出。 (如果你知道其他命令,女巫可以把这个信息作为关键:值,它会有帮助。或者这个命令可能有一个参数来格式化它?)
如果我能得到这样的东西,它会有很多帮助:
接口名称:本地连接
类型:专用
州:已连接
管理状态:已启用
接口名称:本地连接2
类型:专用
州:已连接
管理状态:已启用
答案 0 :(得分:2)
您应该使用Java功能来获取网络接口。课程NetworkInterface
提供您正在寻找的内容。
您可以在此处找到示例:Listing Network Interface Addresses
答案 1 :(得分:2)
BufferedReader b = new BufferedReader(new StringReader(myString));
String line;
while (!(line = b.readLine()).startsWith("-----")) {/*skip*/};
while ((line = b.readLine()) != null) {
if (line.trim().equals("")) continue; // skip blank lines
String[] splat = line.split(" +",4);
System.out.println("Interface Name : " + splat[3]);
System.out.println("Type : " + splat[2]);
System.out.println("State : " + splat[1]);
System.out.println("Admin State : " + splat[0]);
}
b.close();
答案 2 :(得分:1)
如果列的宽度已知,请使用String.substring(..)
获取每列& trim()
结果。
答案 3 :(得分:0)
如果你知道这些职位,你可以这样做
String state = line.substring(15, 30).trim();
如果您不知道,则解析已知标题的第一行(如line.indexOf("State")
),这将告诉您这些位置。
// for the header line
int stateBegin = line.indexOf("State");
int typeBegin = line.indexOf("Type");
// for all other lines
String state = line.substring(stateBegin, typeBegin).trim();
答案 4 :(得分:0)
如果没有列分隔符:
1 - 它似乎是固定大小的字段。这意味着列将始终具有X个字符,下一个列将始终从X + 1开始。例如,“Admin State”将始终包含15个字符,“State”将始终以第16个字符开头。 “州”也有15个字符[...]
2 - 如果固定大小的字段不起作用,您可以尝试解析2个空格,但它容易出错
答案 5 :(得分:0)
String s ="Admin State State Type Interface Name";
String[] str = s.split(" +");
for(String ss: str)
System.out.println(ss);
尝试使用上面的代码将String拆分为多个空格。
输出:
Admin State
State
Type
Interface Name