0

背景:

次のような応答があります(新しい行に注意してください):

HTTP/1.1 200 OK
CACHE-CONTROL: max-age = 180
EXT:
LOCATION: http://172.16.16.16:80/upnp.jsp
SERVER: Linux/2.6.32.24 UPNP/1.0 ZD3025/9.5.1.0
ST: upnp:rootdevice
USN: uuid:6e4bb543-fff6-4384-a4be-::upnp:rootdevice

次のサーバー行に一致させたいと思います。

Linux/2.6.32.24 UPNP/1.0 ZD3025/9.5.1.0

実装:

Linux、UPNP、ZD (この順序で) の文字を除いて、上記の応答のどの文字も気にしません。

だから私は .* を使用して、任意の数の文字、数字、特殊文字に一致させています。

-(void) regexCompareForUPnP:(NSString *) string {
    NSError * err = nil;

    //Building expression

    NSString *expression = @"^.*Linux.*UPNP.*ZD.*$";


    NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:expression options:0 error:&err];
    NSUInteger numberOfMatches = [regex numberOfMatchesInString:string
                                                        options:0
                                                          range:NSMakeRange(0, [string length])];

    NSLog(@"Matches found: %d", numberOfMatches);
}

これまでのところ、見つかった一致: 0.

質問:

つまり、要するに次のようになります。

NSString *expression = @"^.*Linux.*UPNP.*ZD.*$";

これを一致させます:

Linux/2.6.32.24 UPNP/1.0 ZD3025/9.5.1.0

編集:

  1. 完璧に機能したomzに感謝します。
  2. 今、私は以前に一致させようとしていたものと一緒に、(LOCATION 行の) upnp.jsp を一致させようとしています。だから私はこれを試しました:

NSString *expression = @"^.*upnp.jsp\n.*Linux.*UPNP.ZD. $ ";

それはうまくいきません。あなたの助けに感謝..

4

1 に答える 1

0

私はこの正規表現ライブラリに慣れていません。ただし、一致させようとしているものに基づいて、OS と個々のプログラムの間の改行に関係している可能性があります。

これを試して:*expression = @"upnp.jsp\r?\n[^\n]*?Linux[^\n]*?UPNP[^\n]*?ZD"

あなたが試みていることから加えられた他のいくつかの変更。

次の 2 つの理由からに置き換えまし.*た。[^\n]*?

  • このライブラリ.*が . .*との違いは.*?、正規表現エンジンによって異なります。少なくとも私が使用しているほとんどの正規表現エンジンで.*は、デフォルトで貪欲です。つまり、式で一致を見つけながら、できるだけ多くのデータをキャプチャします。貪欲でないバージョン を使用.*?すると、正規表現は式全体を満たすのに必要なだけキャプチャすることを意味します。これは、最後に詳しく説明する例で特に明らかです。
  • 周囲を削除したのは^$、それらが追加されたり前に追加されたりすると、.*処理時間の増加にしか作用しないためです(一致するグループを使用していない限り)。^(.*)upnpまたは^(.*upnp)、一致したグループの内容を使用していた場合、最初の^.*.

貪欲/非貪欲に関しては、一連の二重引用符の間でデータを一致させようとすると、違いが明らかになります"。簡単にするために、キャプチャしたい文字列の途中で二重引用符をエスケープすることは扱いません。

次の文字列を指定します。I said, "Hi." She responded with, "Hello!"

貪欲な正規表現を使用する"(.*)"と、一致するグループは次のようになります。Hi." She responded with, "Hello!

貪欲でない正規表現を使用する"(.*?)"と、一致するグループは次のようになります。Hi.

于 2013-03-29T11:03:03.697 に答える