2017-12-16 28 views
0

NSRegularExpression을 사용하여 텍스트에서 문자열의 발생을 찾습니다. 이런 식으로 뭔가 :NSRegularExpression은 어떻게 NSRange를 벗어납니다.

NSInteger numberOfRanges = [match numberOfRanges]; 

// then I enumerate the ranges 

for (int i=0; i<[match numberOfRanges]; i++) { 
    NSRange range = [match rangeAtIndex:i]; 
    // The problem here is that some ranges come out of bounds 
} 
: 결과가 여러 범위를 가질 수 있기 때문에, 나는이 라인을 가지고

[regex enumerateMatchesInString:textContent options:0 range:NSMakeRange(0, [textContent length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){ 

    }]; 
블록 내부

하고 그런 다음

NSRegularExpression *regex = [NSRegularExpression 
           regularExpressionWithPattern:@"<a href=\"(.*)\">(.*)</a>[:blank:]|[:blank:](.*)\\n\\n\\n" 
           options:NSRegularExpressionCaseInsensitive 
           error:&error]; 

, 나는이 사용 결과를 열거

범위를 열거하는 동안 일부는 범위를 벗어납니다. 이 범위가 코드 자체에서 발견되면 어떻게 될 수 있습니까 ???

+1

요약에서 어떤 일이 벌어지고 있는지 말하기는 매우 어렵습니다. 샘플 데이터로 문제를 보여주고 Github과 같은 어딘가에 게시 할 수있는 최소한의 예제 프로젝트를 만들 수 있습니까? –

+1

충돌 할 때 일치하지 않습니까? 이 경우 Objective-C에서 numberOfRanges는 nil로 끝나고 for 루프는 한 번 실행되고 충돌합니다. 이 경우를 테스트하기 위해 블록 상단에'if (match == nil) {return}'이 필요합니다. –

+0

@DuncanC - ok, 그러나 numberOfRanges가 0보다 큰 경우 NSRange를 nil과 동일하게 설명 할 수 있습니까? 설명해 주신 덕분에 – SpaceDog

답변

1

정규식의 괄호 안의 표현식이 아무 것도 일치하지 않으면 어떻게되는지 물어보십시오. 예를 들어, RE 고려 :

(a)|(b)(c)?(d) 

와 문자열이 일치 : 항상 네 괄호에 표현이있다

a 
bd 
bcd 

을 지금 RE에, 그래서 numberOfRanges는 항상 비록 4 것 (|으로 인해) 모두가 일치 할 수 없습니다. 그래서 어떤 것과도 일치하지 않는 범위에 대해 반환되는 것은 무엇입니까? 문서가 NSRegularExpression인지 확인하면 범위가 {NSNotFound, 0}이며 location 회원의 값은 NSNotFound입니다.

이 "일치하지 않음"범위는 오류를 확인하지 않으므로 오류가 발생합니다.

HTH

+0

. NSRegularExpression은 3 개의 조건이 일치하는 경우에만 일치를 고려할 것이라고 생각했지만 그렇지 않습니다. – SpaceDog