언급 한 함수를 호출 중이며 모든 일치를 올바르게 반복합니다. 그러나 모든 일치 된 블록을 처리 한 후에는 실행이 완료되지 않습니다. 나는 무엇을 잘못하고있을 것인가?NSRegularExpression enumerateMatchesInString : [...] usingBlock이 절대 멈추지 않습니다.
사용 된 정규 표현식은 다음과 같습니다 /\[([^\[\{,]*(,\n)?)*\]/
언급 한 함수를 호출 중이며 모든 일치를 올바르게 반복합니다. 그러나 모든 일치 된 블록을 처리 한 후에는 실행이 완료되지 않습니다. 나는 무엇을 잘못하고있을 것인가?NSRegularExpression enumerateMatchesInString : [...] usingBlock이 절대 멈추지 않습니다.
사용 된 정규 표현식은 다음과 같습니다 /\[([^\[\{,]*(,\n)?)*\]/
자신의 질문에 대한 대답을 판단하면 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
을 사용합니다.
options
에 NSMatchingReportCompletion
을 추가하면이 문제를 해결할 수 있습니다.이 블록은 여러 번 호출되는 것이 아니라 일치하는 경우에만 호출되고 완료되면 다시 호출됩니다. 그게 해결책이지만, 그것은 비 숙련 된 해결책이고 문제의 근원을 간과하고 있습니다.
문제는 NSRegularExpressionCaseInsensitive
단순히 enumerateMatchesInString
의 options
매개 변수에 대한 적절한 값되지 않는 것입니다 ... 그것은) regularExpressionWithPattern
에 대한 options
값입니다. 더욱이 NSRegularExpressionCaseInsensitive
은 단지 사용자가 설명하는 동작을 생성하는 NSMatchingReportProgress
과 동일합니다.
올바른 해결책은 다음과 같이 0
의 options
값을 전달하고, enumerateMatchesInString
는 일치하는 호출됩니다, 그리고 중간 진전되지 완료시 :
[regex enumerateMatchesInString:stringToSearch
options:0
range:NSMakeRange(0, [stringToSearch length])
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
// do stuff here
}];
oops. 네가 옳아. 내 잘못이야. –
내가 옵션으로 NSMatchingReportCompletion
을 전달하여과 일치 전무 경우 YES로 정지를 설정하여이 문제를 해결했습니다.
당신 확인이 당신의 정규식? 나에게 맞는 것 같지 않습니다. – FailedDev
Objective-C 문자열로 형식이 지정됩니다. –
정상 Regexp 형식으로 고정했습니다. –