2013-02-22 2 views
-4

Каков наилучший способ разобрать эту строку в java?Каков наилучший способ разобрать эту строку в java?

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

Enabled  Connected  Dedicated  Local Area Connection 2 

между каждым словом пространство, а не вкладка, а не любая вещь еще, как вы можете видеть количество пространства не равен, а также между словом, например, «Подключение по локальной сети» пространство.

Фактически я хочу, чтобы имя всего моего сетевого интерфейса и состояние из них. Это вывод команды «netsh» в окнах. (если вы знаете другую команду, ведьма может получить мне эту информацию как ключ: значение, это будет полезно или может быть аргумент для этой команды для ее форматирования?)

Если я могу получить что-то подобное, это будет помочь много:

Имя интерфейса: Подключение по локальной сети
Тип: Выделенные
Состояние: Подключено
Admin State: Enabled

Имя интерфейса: Подключение по локальной сети 2
Тип: Выделенные
State: Connected
Admin State: Enabled

+0

Похоже, картина не достаточно странно, чтобы использовать регулярные выражения, попробуйте написать что-то, чтобы отделить столбцы и просто дать особое внимание на первую строку (столбцы заголовков). Вы действительно хотите получить код? Вы пробовали peoplePerHour.com? – theMarceloR

+0

@TomCammann Я попробовал что-то с String.split(), но я не могу получить желаемый результат. – mehdok

+0

@nickecarlo: Спасибо, человек, я даже не думал об этом, вы - большая помощь. – mehdok

ответ

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

+0

@ Алдерат да, исправленный. – xagyg

+0

Может быть, два пространства были бы лучше ... (Извините, я не могу его здесь поместить, форматировщик кода показывает только один: '' + "') – gaborsch

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

+1

@cHao да ... но я бы сказал, что OP задает неправильный вопрос ;-) – Kai

+0

это кажется лучшим способом в конце концов, но в упомянутой ссылке код просто находит имя сетевого интерфейса, а не его состояние, я изучу класс, возможно, есть какой-то метод для этого. – mehdok

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 
Смежные вопросы