2013-06-30 1 views
0

Я пытаюсь написать программу Server-Client. Я могу отправить текст протокола и получить текст правильно. Но когда я пытаюсь разобрать текст, у меня проблема с классом Matcher. Потому что он соответствует только первой строке. Итак, как я могу найти правильный текст и разбор текста. Я думаю, что Matcher не пытается сопоставить другую строку. Если это ошибка, как я могу ее исправить, или я собираюсь разделить каждую строку, а затем попытаюсь разобрать.Разбор абзаца протокола с помощью сокета?

пример ниже, я не могу соответствовать строке на выражение.

String veri ="SIP/2.0 200 OK\r\n" 
+"Via: SIP/2.0/UDP 10.10.10.34:5060;branch=z9hG4bK3834f681a;received=10.10.10.17\r\n" 
+"From: <sip:[email protected]>;tag=as153459088\r\n" 
+"To: <sip:[email protected]>;tag=as6163450a5a\r\n" 
+"Call-ID: [email protected][::1]\r\n" 
+"CSeq: 18368 REGISTER\r\n" 
+"Server: Asterisk PBX 11.3.0\r\n" 
+"Allow: INVITE, ACK, CANCEL, OPTIONS, BYE, REFER, SUBSCRIBE, NOTIFY, INFO, PUBLISH\r\n" 
+"Supported: replaces, timer\r\n" 
+"Expires: 120\r\n" 
+"Contact: <sip:[email protected]:5060>;expires=120\r\n" 
+"Date: Sat, 29 Jun 2013 14:00:50 GMT\r\n" 
+"Content-Length: 0"; 
    //veri="To: <sip:[email protected]>;tag=34dgd\r\n"; 
    Pattern p1 = Pattern.compile("^To\\: (.*);tag=(.*)$"); 

    Matcher m = p1.matcher(veri); 

    if(m.find()){ 

    System.out.println(m.group(1).trim()); 
    } 

Благодарим Вас за помогает

ответ

1

Вам просто нужно включить режим многострочного согласования с использованием встроенного (?m) флаг или Pattern.MULTILINE режим в своем регулярном выражении. Таким образом, $ остановится на каждом терминале линии, а не на конце всего ввода.

Pattern p1 = Pattern.compile("(?m)^To: (.*);tag=(.*)$"); 

Кроме того, вместо того, чтобы:

if(m.find()) 

вы должны использовать:

while (m.find()) 

отметить также, что вы несовпадающих имя ссылки Сличитель. Вы используете совпадение внутри вашего if, но вы определили m.

P.S: Вы повторно назначаете новое значение своей строке в конце. Убедитесь, что вы используете += вместо =.

+0

Прежде всего, спасибо за ответ. когда я компилирую, я не могу получить правильные предложения. он по-прежнему не пытается сопоставлять другие строки. İ попробуй, чтобы найти, где я неправ, здесь http://www.vogella.com/articles/JavaRegularExpressions/article.html. но не могу найти. – Acablack

+0

@Acablack. Извините, отредактировал ответ. Пропустил флаг '(? M)'. Теперь это сработает. –

+0

oww Да, это для теста, почему он не подходит для других строк. Спасибо за Пс. И да, он работает с (м) флагом. Но я кое-что удивляюсь. Когда я устанавливаю точку останова на println и вижу m.find(), она говорит false. почему он становится ложным после чтения истины. это странно. – Acablack

0

Я хотел бы использовать это регулярное выражение

^To:\s+([^;]*);tag=(\w+) 

 Смежные вопросы

  • Нет связанных вопросов^_^