簡體   English   中英

NSRegularExpression匹配特定模式

[英]NSRegularExpression to match a certain pattern

背景:

我有這樣的回應(請注意新行):

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. 現在,我嘗試將upnp.jsp(在LOCATION行中)與之前嘗試的匹配。 所以我嘗試了這個:

的NSString *表達= @ “^ * upnp.jsp \\ n * Linux *的UPNP ZD $。。。”;

那行不通。 感謝您的幫助..

我對這個正則表達式庫不熟悉。 但是,根據您要匹配的內容,可能與操作系統和各個程序之間的換行有關。

試試這個: *expression = @"upnp.jsp\\r?\\n[^\\n]*?Linux[^\\n]*?UPNP[^\\n]*?ZD"

您還嘗試了其他一些更改;

我已經更換.*[^\\n]*? 有兩個原因:

  • 我不確定該庫如何處理.* ,但是與更具體的內容(例如,尋找不是換行符的非貪婪字符集)相比,使用它通常效率不高。 .*.*?之間的區別.*? 取決於正則表達式引擎。 在大多數正則表達式引擎中,我至少使用.*默認為貪婪; 也就是說,它將在使表達式找到匹配項的同時捕獲盡可能多的數據。 使用非貪婪版本.*? ,意味着正則表達式將僅捕獲滿足整個表達式所需的內容。 這一點在我將在最后進行擴展的示例中特別明顯。
  • 我刪除了周圍的^$因為當它們附加並以.*開頭時,它們只會增加處理時間(除非您使用的不是匹配組)。 如果您正在執行^(.*)upnp^(.*upnp) ,然后使用匹配組的內容,則可能會有初始的^.*

至於貪/不貪婪,當試圖匹配一對雙引號之間的數據的差異變得明顯" 。為了簡便起見,我不會與你也希望有一個字符串中間已經逃脫雙引號處理捕獲。

輸入以下字符串: I said, "Hi." She responded with, "Hello!" I said, "Hi." She responded with, "Hello!"

使用貪婪的正則表達式"(.*)" ,匹配的組將為Hi." She responded with, "Hello!

使用非貪婪正則表達式"(.*?)" ,匹配的組將為Hi.

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM