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単に...のoptionsパラメータに適切な値ではないということです。これは)の値です。さらに悪いことに、あなたが説明する振る舞いを生成する、とまったく同じです。enumerateMatchesInStringoptionsregularExpressionWithPatternNSRegularExpressionCaseInsensitiveNSMatchingReportProgress

正しい解決策は、以下のようにoptions値を渡すことです。これは、中間の進行や完了時ではなく、一致のためだけに呼び出されます。0enumerateMatchesInString

[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オプションとして渡し、一致が nil の場合に stop を YES に設定することで、この問題を修正しました。

于 2012-08-10T13:19:09.783 に答える