gpt4 book ai didi

objective-c - NSRegularExpression enumerateMatchesInString : [. ..] usingBlock 永远不会停止

转载 作者:行者123 更新时间:2023-12-01 18:27:45 25 4
gpt4 key购买 nike

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

使用的正则表达式是:/\[([^\[\{,]*(,\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!
}];

乍一看,这看起来不错,编译器没有提示,但是我们得到了 block 被调用太多次的不良行为,通常是 result == nil .

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

问题是 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
}];

关于objective-c - NSRegularExpression enumerateMatchesInString : [. ..] usingBlock 永远不会停止,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11889841/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com