2011-10-05 3 views
7

NSRegularExpression을 사용하여 "badgeCount"태그 사이에 "6"값을 추출하는 방법. 다음은 서버의 응답입니다.두 개의 XML 태그 사이에서 텍스트를 추출하는 NSRegularExpression

<?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

http : //를 사용하여 필요한 값을 추출하는 데 NSXMLParser가 필요하지 않습니다. "필요한 정규 표현식을 얻었습니다."(? <=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

관련 문제