我正在调用上述函数,它正确地遍历所有匹配项。但是,在处理完所有匹配的块后,它并没有完成执行。我可能做错了什么?
使用的正则表达式是:/\[([^\[\{,]*(,\n)?)*\]/
我正在调用上述函数,它正确地遍历所有匹配项。但是,在处理完所有匹配的块后,它并没有完成执行。我可能做错了什么?
使用的正则表达式是:/\[([^\[\{,]*(,\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
.
NSMatchingReportCompletion
您可以通过添加到,来解决这个问题options
,而不是多次调用该块,它仅在匹配时调用,并在完成时再次调用。这解决了它,但它是一个不优雅的解决方案,并且忽略了问题的根源。
问题在于,对于...的参数而言,这NSRegularExpressionCaseInsensitive
根本不是一个合适的值,而是 ) 的值。更糟糕的是,恰好与 相同,这会产生您描述的行为。options
enumerateMatchesInString
options
regularExpressionWithPattern
NSRegularExpressionCaseInsensitive
NSMatchingReportProgress
正确的解决方案是简单地传递一个 的options
值0
,如下所示,并且enumerateMatchesInString
仅在匹配时调用,而不是为临时进度而不是在完成时调用:
[regex enumerateMatchesInString:stringToSearch
options:0
range:NSMakeRange(0, [stringToSearch length])
usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {
// do stuff here
}];
我已通过NSMatchingReportCompletion
作为选项传递并在匹配为零时将停止设置为 YES 来解决此问题。