2011-10-05 175 views
7

如何使用NSRegularExpression提取「badgeCount」標記之間的值「6」。以下是服務器的響應:NSRegularExpression在兩個XML標記之間提取文本

<?xml version="1.0" encoding="UTF-8" standalone="yes"?><badgeCount>6</badgeCount><rank>2</rank><screenName>myName</screenName> 

以下是我嘗試過的代碼,但未取得成功。實際上,它在去其他部分並打印「正則表達式的值是無」:

NSString *responseString = [[NSString alloc] initWithBytes:[responseDataForCrntUser bytes] length:responseDataForCrntUser.length encoding:NSUTF8StringEncoding]; 

NSError *error; 
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?<=badgeCount>)(?:[^])*?(?=</badgeCount)" options:0 error:&error]; 
if (regex != nil) { 
    NSTextCheckingResult *firstMatch = [regex firstMatchInString:responseString options:0 range:NSMakeRange(0, [responseString length])]; 
    NSLog(@"NOT NIL"); 
    if (firstMatch) { 
     NSRange accessTokenRange = [firstMatch rangeAtIndex:1]; 
     NSString *value = [urlString substringWithRange:accessTokenRange]; 
     NSLog(@"Value: %@", value); 
    } 
} 
else 
    NSLog(@"Value of regex is nil"); 

如果你能提供將不勝感激示例代碼。

注意:我不想使用NSXMLParser。

+0

爲什麼你不想要你選擇一個XML解析器來解析XML? – Mat

+0

到目前爲止您嘗試過什麼? – Mat

+0

不需要NSXMLParser來提取幾個值...我使用http://使用正則表達式「(?<=badgeCount>)(?:[^])??(?= Prazi

回答

18

實施例:

NSString *xml = @"<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?><badgeCount>6</badgeCount><rank>2</rank><screenName>myName</screenName>"; 
NSString *pattern = @"<badgeCount>(\\d+)</badgeCount>"; 

NSRegularExpression *regex = [NSRegularExpression 
             regularExpressionWithPattern:pattern 
             options:NSRegularExpressionCaseInsensitive 
             error:nil]; 
NSTextCheckingResult *textCheckingResult = [regex firstMatchInString:xml options:0 range:NSMakeRange(0, xml.length)]; 

NSRange matchRange = [textCheckingResult rangeAtIndex:1]; 
NSString *match = [xml substringWithRange:matchRange]; 
NSLog(@"Found string '%@'", match); 

的NSLog輸出:

Found string '6' 
+0

如果我想要在標記之間獲得值「myName」,是否需要創建新的正則表達式,還是可以在相同的情況下執行? – Prazi

+1

這將需要一個新的正則表達式,因爲「\ d +」指定一個或多個數字。對於某個名稱,您需要使用「\ S +」(如果名稱中沒有空格)。有一個更普遍的正則表達式可以在任何情況下工作:@「([^ <] +)」,它表示任何與「<」字符相關的內容。 – zaph

+0

感謝您的幫助。非常感激。 ....這意味着我需要兩個獨立的模式1. ([^ <] +)獲取badgeCount 2. ([^ <] +)獲取screenName。 – Prazi

1

要做到這一點在迅速3.0

func getMatchingValueFrom(strXML:String, tag:String) -> String { 
    let pattern : String = "<"+tag+">(\\d+)</"+tag+">" 
    let regexOptions = NSRegularExpression.Options.caseInsensitive 

    do { 
     let regex = try NSRegularExpression(pattern: pattern, options: regexOptions) 
     let textCheckingResult : NSTextCheckingResult = regex.firstMatch(in: strXML, options: NSRegularExpression.MatchingOptions(rawValue: UInt(0)), range: NSMakeRange(0, strXML.characters.count))! 
     let matchRange : NSRange = textCheckingResult.rangeAt(1) 
     let match : String = (strXML as NSString).substring(with: matchRange) 
     return match 
    } catch { 
     print(pattern + "<-- not found in string -->" + strXML) 
     return "" 
    } 
} 

PS:這是相應於obj-的@ zaph的溶液迅速溶液c

相關問題