2013-02-22 53 views
-4

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

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

Enabled  Connected  Dedicated  Local Area Connection 2 

每个字之间的空间,而不是标签,否则没有任何东西,因为你可以看到的空间数量不相等,而且字之间,如“本地连接”的空间。

实际上我想要我的所有网络接口的名称和它们的状态。 这是windows中“netsh”命令的输出。 (如果你知道其他命令女巫可以把我的这个信息作为关键值:它会是有用的,或者可能有这个命令的格式化参数?)

如果我能得到这样的东西,它会很多帮助:

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

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

+0

貌似模式是不够的怪异使用正则表达式,尝试写一些东西来分隔列,只是给予了特别关注的第一行(列标题)。你想要实际的代码吗?你尝试过PeoplePerHour.com吗? – theMarceloR 2013-02-22 14:02:52

+0

@TomCammann我用String.split()尝试了一些东西,但是我无法得到想要的结果。 – mehdok 2013-02-22 14:10:45

+0

@nickecarlo:谢谢你,我甚至都没有想过,你是非常有帮助的。 – mehdok 2013-02-22 14:11:48

回答

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(); 
+0

不应该用'“+”而不是'“*”'作为正则表达式吗? – Alderath 2013-02-22 14:11:11

+0

@Alderath是的,修复。 – xagyg 2013-02-22 14:15:03

+0

也许两个空格会更好...(对不起,我不能把它放在这里,代码格式化程序只显示一个:'“+”') – gaborsch 2013-02-22 14:24:14

1

如果列是已知的宽度,用String.substring(..)让每列& trim()结果。

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(); 
0

如果没有列分隔符:

1 - 这似乎是固定大小字段。这意味着列总是有X个字符,而下一列始终始于X + 1。在你的例子中,“Admin State”总是有15个字符,而“State”总是从第16个字符开始。 “国家”也有15个字符[...]

2 - 如果固定大小字段不工作,你可以尝试通过2个空格来分析,但它的方式很容易出错

2

你应该使用Java获取网络接口的功能。该类NetworkInterface提供您正在寻找的东西。

你可以在这里找到一个例子:Listing Network Interface Addresses

+0

对我来说,这听起来像是一个更好的解决OP的真正问题。不幸的是,这是一个完全不同于他实际询问的问题。 :P – cHao 2013-02-22 14:04:07

+1

@cHao是的......但我会说OP要求错误的问题;-) – Kai 2013-02-22 14:06:45

+0

这似乎是更好的方法毕竟,但在你提到的链接中,代码只是找到网络接口的名称,而不是它的状态,我会探讨的类,可能有一些方法来做到这一点。 – mehdok 2013-02-22 14:19:09

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 
相关问题