[英]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
的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.