上記の関数を呼び出していますが、すべての一致を正しく繰り返しています。ただし、一致したすべてのブロックが処理された後で実行が終了するわけではありません。私は何を間違っているのでしょうか?
使用される正規表現は次のとおりです。/\[([^\[\{,]*(,\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
オプションとして渡し、一致が nil の場合に stop を YES に設定することで、この問題を修正しました。