2016-01-21 3 views
1

У меня есть ниже ответ от некоторого сервера TelnetРазбивает строку только с первого экземпляра Java

String response = "I:[email protected]||K:CMS||O:REgetPerspectiveList||A0:googleP||A1:yahooP||A2:gmail||A3:test||A4:hello||A16:CCTV Barco||A17:CCTV: Corridor CC||A18:CCTV: DR Andy Warhol||A19:CCTV: DR Gaudi (Analog)||A20:CCTV: DR Miro||A21:CCTV: Entrance CC||A22:CCTV: Gaudi Demo Room Megapixel||"; 

Я хочу, чтобы получить значение атрибутов, например, А0, А1 и т.д., и поэтому я пишу ниже логики

String[] strings = response.split("[||]"); 
List<String> list = new ArrayList<>(); 

for (String string : strings) { 
    if (string.contains(":")) { 
     String[] attributes = string.split(":"); 
     if (attributes[0].startsWith("A")) { 
      list.add(attributes[1]); 
     } 
    } 
} 

Но моя проблема в том, что split.split (":") split дает мне строковый массив, но мне требуется только два массива строк размера длины. Напр. ответ A17 дает мне «CCTV» в качестве атрибутов [1] и «Коридор CC» в качестве атрибутов [2], но я требую только «CCTV: Коридор CC» как атрибут [1].

Какое регулярное выражение я должен писать в string.split (regexp), так что строка может быть разбита на основе первого экземпляра оператора двоеточия только с точно двумя строками строк размера длины.

+0

Вы можете использовать методы подстроки с indexOf, чтобы получить индекс первого ':' и использовать подстроку до этого индекса и поместить две строки в массив. – Tushar

+0

Я могу это сделать, но я хочу регулярное выражение. –

+0

Pranav, он дает мне такой же ответ, что и раньше, означает CCTV только для атрибута a17 –

ответ

1

Код ниже расщепляется на трубах первого, а затем использует регулярное выражение для извлечения из свойств и атрибутов. Заметьте, что даже там, возможно, вам удастся сделать еще один раскол.

String response = "I:[email protected]||K:CMS||O:REgetPerspectiveList||A0:googleP||A1:yahooP||A2:gmail||A3:test||A4:hello||A16:CCTV Barco||A17:CCTV: Corridor CC||A18:CCTV: DR Andy Warhol||A19:CCTV: DR Gaudi (Analog)||A20:CCTV: DR Miro||A21:CCTV: Entrance CC||A22:CCTV: Gaudi Demo Room Megapixel||"; 
String[] metaParts = response.split("\\|\\|"); 

for (int i=0; i < metaParts.length; ++i) { 
    String property = metaParts[i].replaceAll("(.*):(.*)", "$1"); 
    String attribute = metaParts[i].replaceAll("(.*):(.*)", "$2"); 
    System.out.println(property + ":" + attribute); 
} 

Как уже говорилось, регулярные выражения не являются панацеей, чтобы вылечить все ваши проблемы с развитием. И расщепление, безусловно, делает тяжелый подъем для этой проблемы.

+0

На самом деле, это очень много работы для выполнения чего-то, что regex, возможно, действительно * не должно * выполнять ... – Makoto

0

Set a limit на вашем расколе.

String[] attributes = string.split(":", 2); 

Это заставит регулярное выражение будет применяться только один раз (в документации он применяется N-1 раз), так что ваши группировки будут разделены только на двоеточии один раз.

После нанесения в код, результат выглядит следующим образом:

[googleP, yahooP, gmail, test, hello, CCTV Barco, CCTV: Corridor CC, CCTV: DR Andy Warhol, CCTV: DR Gaudi (Analog), CCTV: DR Miro, CCTV: Entrance CC, CCTV: Gaudi Demo Room Megapixel] 
0
import java.util.HashMap; 
import java.util.regex.Matcher; 
import java.util.regex.Pattern; 

public class TestRegex { 

public static void main(String[] args) { 

    String response = "I:[email protected]||K:CMS||O:REgetPerspectiveList||A0:googleP||A1:yahooP||A2:gmail||A3:test||A4:hello||A16:CCTV Barco||A17:CCTV: Corridor CC||A18:CCTV: DR Andy Warhol||A19:CCTV: DR Gaudi (Analog)||A20:CCTV: DR Miro||A21:CCTV: Entrance CC||A22:CCTV: Gaudi Demo Room Megapixel||"; 
    Matcher mat = Pattern.compile("([^\\:]+)\\:([^\\|]+)\\|\\|").matcher(response); 
    HashMap<String, String> hm = new HashMap(); 
    while(mat.find()) { 
     if(mat.groupCount() > 0) { 
      String k = response.substring(mat.start(1), mat.end(1)); 
      String v = response.substring(mat.start(2), mat.end(2)); 
      hm.put(k, v); 

      System.out.println(k + " => " + v); // debug 
     } 
    } 
    // you may refer to your data from hashmap hm here! 
    System.out.println(hm.get("K")); 
} 

} // end class 
Смежные вопросы