2012-11-15 5 views
0

을받지 못했습니다. NSRegularExpression을 사용하여이 작업을 수행하려고합니다.NSRegularExpression 나는 같은 문자열이 정확한 텍스트

NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(<book>MyBook</book>\\s*<value>).*?(</value>)" 
                      options:NSRegularExpressionCaseInsensitive 
                      error:&error]; 
    NSArray *textArray = [regex matchesInString:myData options:0 range:NSMakeRange(0, [myData length])]; 

    NSTextCheckingResult * result = [rege firstMatchInString:myData 
                  options:0 
                  range:NSMakeRange(0, [myData length])]; 

결과는 다음과 같습니다 :

<book>MyBook</book><value>myValue</value> 

그래서 나는 전체 문자열을 얻을 수 있지만, 난 단지 "myValue"을 원하는 나는이 시도. 어떻게해야합니까? 내가 여기서 무엇을 놓치고 있니?

미리 감사드립니다.

+2

는 "나는 같은 문자열이'의 myBook myValue를'"- 그래서 당신은 NSXMLParser''로 전환된다. *** 이제. *** –

+0

예, 실제로는 XML이다,하지만 난 NSXMLParser의 문제는 XML 1 오류가 발생하면 내가 확실하게 정규식을 사용하려면 그에 그래서, 실패 할 것입니다 읽었습니다 내용을 읽을 수 있습니다. – CyberK

+0

조작 된 콘텐츠를 읽으려고합니까? 최소한 NSXMLParser는 오류 메시지를 생성 할 수 있습니다. XML/HTML을 파싱하기 위해 정규 표현식을 사용하는 것이 좋지 않은 이유는 불가능하다는 것입니다. XML은 정규 표현식으로 표현할 수없는 내용을 표현할 수 있기 때문에 정규식이있는 완벽한 XML 파서를 작성할 수 없습니다. 컴퓨터 과학 101. –

답변

0

전체 문자열과 일치하는 정규식을 작성했기 때문에 발생합니다. 난 단지 문자열의 myValue 부분과 일치하는 정규 표현식을 작성하는 것은 너무 (때문에 당신은 아마 myValue이하는 것을 일치의 myBook 문자열을 가지고 있다는 사실을)를 방해하는 복잡한 것을 이해 할수 것입니다.

정규식을 사용하지 않는 것이 좋습니다. 왜냐하면 여기에서 설명한 용도로 사용하지 않기 때문입니다. 당신이 어떤 XML의 직렬화를 사용하지 않으려면, 당신은 NSScanner 또는 간단하고 쉽게 코드를 유지하기 위해 양보 할 NSString 클래스의 방법 중 하나를 사용할 수 있습니다.

NSString *stringToBeScanned = @"<book>MyBook</book><value>myValue</value>"; 
NSString *myValue; 

NSScanner *scanner = [NSScanner scannerWithString:stringToBeScanned]; 
[scanner scanUpToString:@"<value>" intoString:nil]; 
// After the above, we've got "<value>myValue</value>" left to scan 

[scanner scanUpToString:@"</value>" intoString:&myValue]; 
// We ended up with a "<value>myValue" type of a string 

// This will trim the remaining of the string we don't need 
myValue = [myValue stringByReplacingOccurrencesOfString:@"<value>" withString:@""]; 

는 위의 아마 더 나은 기록 할 수 있고 내 머리를 밖으로 쓰는 실수 나 둘을 한 수도 있지만 원칙이 작동합니다 : NSScanner와 몇 가지 다른 방법을 사용하여 예를 들어

, .

+0

Thx! 나는 이것에 대해 생각하고 있었지만 어쩌면 정규식을 사용하는 것이 더 좋을 수도 있습니다. 지금이 코드를 사용했고 작동했습니다. 다시 Thx! – CyberK

관련 문제