0

サーバー クライアント プログラムを作成しようとしています。プロトコル テキストを送信し、テキストを正しく取得できます。しかし、テキストを解析しようとすると、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:4420145@10.10.10.24>;tag=as153459088\r\n"
+"To: <sip:44520145@10.10.10.24>;tag=as6163450a5a\r\n"
+"Call-ID: 1e0ssdfdb7f456e5977bc0df60645348cf1ce@[::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:345dgd@10.10.10.17:5060>;expires=120\r\n"
+"Date: Sat, 29 Jun 2013 14:00:50 GMT\r\n"
+"Content-Length: 0";
  //veri="To: <sip:3453@10.10.10.24>;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());
  }

助けてくれてありがとう

4

2 に答える 2

1

正規表現に埋め込まれたフラグまたはモードを使用して、一致の複数行モードを有効にするだけです。このようにして、入力全体の終わりではなく、行末記号ごとに停止します。(?m)Pattern.MULTILINE$

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

また、代わりに:

if(m.find())

あなたが使用する必要があります:

while (m.find())

また、 Matcher参照名が一致していないことにも注意してください。内でマッチャーを使用していますが、 mifを定義しました。

PS: 最後に文字列に新しい値を再割り当てしています。+=の代わりに必ず使用してください=

于 2013-06-30T13:44:32.537 に答える
0

この正規表現を使用します

^To:\s+([^;]*);tag=(\w+)
于 2013-06-30T14:02:48.413 に答える