1

我正在调用上述函数,它正确地遍历所有匹配项。但是,在处理完所有匹配的块后,它并没有完成执行。我可能做错了什么?

使用的正则表达式是:/\[([^\[\{,]*(,\n)?)*\]/

4

2 回答 2

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.

NSMatchingReportCompletion您可以通过添加到,来解决这个问题options,而不是多次调用该块,它仅在匹配时调用,并在完成时再次调用。这解决了它,但它是一个不优雅的解决方案,并且忽略了问题的根源。

问题在于,对于...的参数而言,这NSRegularExpressionCaseInsensitive根本不是一个合适的值,而是 ) 的值。更糟糕的是,恰好与 相同,这会产生您描述的行为。optionsenumerateMatchesInStringoptionsregularExpressionWithPatternNSRegularExpressionCaseInsensitiveNSMatchingReportProgress

正确的解决方案是简单地传递一个 的options0,如下所示,并且enumerateMatchesInString仅在匹配时调用,而不是为临时进度而不是在完成时调用:

[regex enumerateMatchesInString:stringToSearch
                        options:0
                          range:NSMakeRange(0, [stringToSearch length])
                     usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
                         // do stuff here
                     }];
于 2013-01-24T18:32:06.953 回答
0

我已通过NSMatchingReportCompletion作为选项传递并在匹配为零时将停止设置为 YES 来解决此问题。

于 2012-08-10T13:19:09.783 回答