2013-02-22 96 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 
相關問題