2012-08-09 1 views
1

언급 한 함수를 호출 중이며 모든 일치를 올바르게 반복합니다. 그러나 모든 일치 된 블록을 처리 한 후에는 실행이 완료되지 않습니다. 나는 무엇을 잘못하고있을 것인가?NSRegularExpression enumerateMatchesInString : [...] usingBlock이 절대 멈추지 않습니다.

사용 된 정규 표현식은 다음과 같습니다 /\[([^\[\{,]*(,\n)?)*\]/

+0

당신 확인이 당신의 정규식? 나에게 맞는 것 같지 않습니다. – FailedDev

+1

Objective-C 문자열로 형식이 지정됩니다. –

+0

정상 Regexp 형식으로 고정했습니다. –

답변

4

자신의 질문에 대한 대답을 판단하면 NSMatchingReportCompletion을 전달하여 문제가 해결 된 것으로 보입니다. 나는 당신이 질병보다는 증상을 치료했을 수도 있다고 생각합니다.

실수로 잘못된 options 값을 enumerateMatchesInString으로 전달했는지 궁금합니다.

[regex enumerateMatchesInString:stringToSearch 
         options:NSRegularExpressionCaseInsensitive 
          range:NSMakeRange(0, [stringToSearch length]) 
        usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { 
         // This is called many times, 
         // even when there is no match! 
        }]; 

이, 언뜻보기에, 잘 보이는, 컴파일러는 불평하지 않지만, 우리는 블록의 바람직하지 않은 행동이 너무 많이이라고하기 얻을 : 예를 들어, 실수로 너무처럼 호출하는 것은 매우 쉽다 종종 result == nil을 사용합니다.

optionsNSMatchingReportCompletion을 추가하면이 문제를 해결할 수 있습니다.이 블록은 여러 번 호출되는 것이 아니라 일치하는 경우에만 호출되고 완료되면 다시 호출됩니다. 그게 해결책이지만, 그것은 비 숙련 된 해결책이고 문제의 근원을 간과하고 있습니다.

문제는 NSRegularExpressionCaseInsensitive 단순히 enumerateMatchesInStringoptions 매개 변수에 대한 적절한 값되지 않는 것입니다 ... 그것은) regularExpressionWithPattern에 대한 options 값입니다. 더욱이 NSRegularExpressionCaseInsensitive은 단지 사용자가 설명하는 동작을 생성하는 NSMatchingReportProgress과 동일합니다.

올바른 해결책은 다음과 같이 0options 값을 전달하고, enumerateMatchesInString는 일치하는 호출됩니다, 그리고 중간 진전되지 완료시 :

[regex enumerateMatchesInString:stringToSearch 
         options:0 
          range:NSMakeRange(0, [stringToSearch length]) 
        usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) { 
         // do stuff here 
        }]; 
+1

oops. 네가 옳아. 내 잘못이야. –

0

내가 옵션으로 NSMatchingReportCompletion을 전달하여과 일치 전무 경우 YES로 정지를 설정하여이 문제를 해결했습니다.

관련 문제