2013-06-30 52 views
0

我尝试编写一个Server-Client程序。我可以发送协议文本并正确获取文本。 但是当我尝试解析文本时,我遇到了匹配类的问题。因为它只匹配第一行。所以我怎么才能找到正确的字符串和解析文本。我认为匹配不会尝试匹配其他行。如果它是错误,我该如何修复它,否则我会分裂每一行,然后尝试解析。用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是的它是测试为什么它不能匹配其他线路。感谢Ps。是的,它正在与(米)国旗合作。但我想知道一些事情。当我在println上放置断点并查看m.find()时,它表示为false。为什么在阅读真实之后变成错误。真奇怪。 – Acablack

0

我会用这个表达式

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