2015-07-19 5 views
1

Я хотел бы использовать регулярное выражение для разбора сообщения, полученного через сокет в Android-клиенте, и поместить часть сообщения в список.Использовать регулярное выражение для разбора в Android

Это сообщение для разбора:

{Code=1;NumServices=3;Service1=World Weather Online;Link1=http://www.worldweatheronline.com/;Service2=Open Weather Map;Link2=http://openweathermap.org/;Service3=Weather;Link3=http://www.weather.gov/;} 

и метод я использую:

private void parse(String mess) { 


String Code="0"; 
Pattern pattern = Pattern.compile("Code=(.*?);"); 
Matcher matcher = pattern.matcher(mess); 

while (matcher.find()) { 
    Code = matcher.group(1); 
    Log.d("Matcher", "PATTERN MATCHES! Code parsed "+Code); 
// System.out.println("Code: "+Code); 
} 
Log.d("Matcher", "PATTERN MATCHES! Code not parsed "+Code); 
if(Code.compareTo("1")==0){ 

    // System.out.println("testing the parser"); 

    // Pattern pattern1 = Pattern.compile(";CPU=(.*?);Screen"); 
    Pattern pattern2 = Pattern.compile("NumServices=(.*?);"); 
    Matcher matcher2 = pattern2.matcher(mess); 
    int number=0; 
    if (matcher2.find()) { 
     String numb = matcher2.group(1); 
     this.tester = numb; 
     Log.d("Matcher", "PATTERN MATCHES! numb services"); 
     number = Integer.parseInt(numb); 
    } 
    else{ 
     this.tester = "NOT FOUND"; 
     Log.d("Matcher", "PATTERN MATCHES! match num failed"); 
    } 

    int i; 
    for(i=1;i<=number;i++){ 

     Pattern pattern3 = Pattern.compile(";Service"+i+"=(.*?);"); 
     Pattern pattern4 = Pattern.compile(";Link"+i+"=(.*?);"); 

     Matcher matcher3 = pattern3.matcher(mess); 
     Matcher matcher4 = pattern4.matcher(mess); 

     if (matcher3.find()) { 
     //  Log.d("Matcher", "PATTERN MATCHES! services"); 
      String serv = matcher3.group(1); 
    //  this.tester = serv; 
      your_array_list.add(serv); 

     } 


     if (matcher4.find()) { 
      Log.d("Matcher", "PATTERN MATCHES! links"); 
      String link = matcher4.group(1); 
      your_array_list2.add(link); 
     } 

    } 

} 

} 

Ни один из log.d не работает, так что я не могу проверить поток кода. Что странно, так это то, что я тестировал один и тот же код в Eclipse, и он работает. Когда я использую тост для отображения, он дает мне значение Код, но не Услуга. Есть ли ошибка где-то или регулярное выражение работает по-разному в Android?

Спасибо.

+0

Почему ты просто не добавил Войти .d atte начало метода для проверки значения 'mess'? Это было бы очень полезно для вас ... и для нас !!! –

+0

Я использовал тост, чтобы проверить значение и его сообщение, которое я отправляю с сервера: {Code = 1; NumServices = 3; Service1 = World Weather Online; Link1 = http: //www.worldweatheronline.com/; Service2 = Open Weather Map, Link2 = http: //openweathermap.org/; Service3 = Погода; Link3 = http: //www.weather.gov/;} – user2446260

+0

Просьба пояснить, что вы имеете в виду, когда говорите, что не можете отобразить значение Сервиса. Вы имеете в виду Service1, Service2, Service3 или NumServices? – schtever

ответ

2

Вы можете использовать регулярное выражение 1, чтобы захватить всю необходимую информацию:

Code=([^;]*);NumServices=([^;]*);|Service(\d+)=([^;]*);Link\d+=([^;]*); 

Вот пример кода:

String str = "{Code=1;NumServices=3;Service1=World Weather Online;Link1=http://www.worldweatheronline.com/;Service2=Open Weather Map;Link2=http://openweathermap.org/;Service3=Weather;Link3=http://www.weather.gov/;}"; 
Pattern ptrn = Pattern.compile("Code=([^;]*);NumServices=([^;]*);|Service(\\d+)=([^;]*);Link\\d+=([^;]*);"); 
Matcher matcher = ptrn.matcher(str); 
while (matcher.find()) { 
    if (matcher.group(1) != null) { 
     System.out.println("Code: " + matcher.group(1)); 
     System.out.println("NumServices: " + matcher.group(2)); 
    } 
    else if (matcher.group(1) == null && matcher.group(2) == null) { 
     System.out.println("Service #: " + matcher.group(3)); 
     System.out.println("Service Name: " + matcher.group(4)); 
     System.out.println("Link: " + matcher.group(5)); 
    } 
} 

См IDEONE demo

+1

Я только что узнал, что у меня была проблема в том, как я вызывал этот метод. Оба регулярных выражения работают, но я думаю, что ваш лучше и дает более оптимизированный код. Спасибо вам, ребята !! – user2446260