-4

在 java 中解析这个字符串的最佳方法是什么?

Admin State    State          Type             Interface Name
-------------------------------------------------------------------------
Enabled        Connected      Dedicated        Local Area Connection

Enabled        Connected      Dedicated        Local Area Connection 2

每个单词之间是空格,不是制表符,不是其他任何东西,正如您所看到的空格数不相等,并且诸如“局部区域连接”之类的单词之间也是空格。

实际上我想要我所有网络接口的名称和它们的状态。这是 Windows 中“netsh”命令的输出。(如果您知道其他命令女巫可以将此信息作为键:值获取我,这将很有帮助。或者可能有此命令的参数来格式化它?)

如果我能得到这样的东西,那将有很大帮助:

接口名称:本地连接
类型:专用
状态:已连接
管理状态:已启用

接口名称:本地连接 2
类型:专用
状态:已连接
管理状态:已启用

4

6 回答 6

2

您应该使用 Java 功能来获取网络接口。该课程NetworkInterface提供您正在寻找的内容。

您可以在此处找到示例:列出网络接口地址

于 2013-02-22T14:02:21.263 回答
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();
于 2013-02-22T14:04:50.757 回答
1

如果列的宽度已知,则用于String.substring(..)获取每列和trim()结果。

于 2013-02-22T14:01:17.720 回答
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();
于 2013-02-22T14:01:21.620 回答
0

如果没有列分隔符:

1 - 它似乎是固定大小的字段。这意味着列将始终具有 X 个字符,并且下一列将始终从 X+1 开始。在您的示例中,“Admin State”总是有 15 个字符,“State”总是从第 16 个字符开始。“状态”也有 15 个字符 [...]

2 - 如果固定大小的字段不起作用,您可以尝试按 2 个空格解析,但这样容易出错

于 2013-02-22T14:02:20.347 回答
0
String s ="Admin State    State          Type             Interface Name";
String[] str = s.split("  +");
for(String ss: str)
    System.out.println(ss);

试试上面的代码,用多个空格分割字符串。

输出:

Admin State
State
Type
Interface Name
于 2013-02-22T14:07:00.670 回答