- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
在我正在开发的 iPhone 应用程序的上下文中,我正在使用 NSRegularExpression 解析一些 html 以提取要映射的数据。每当用户将 map “平移”到新位置时,此信息就会更新。
这第一次或两次工作正常,但在第二次或第三次调用该函数时,应用程序挂起。我已经使用 XCode 的探查器来确认我没有泄漏内存,并且没有生成错误(应用程序没有终止,它只是在下面显示的点处执行)。
当我检查正在解析的 HTML 时,我没有发现它在应用程序挂起时不完整或出现其他乱码。
此外,如果我用一组显式地址字符串替换正则表达式代码,一切都会按预期进行。
- (void)connectionDidFinishLoading:(NSURLConnection *)connection {
// receivedData contains the returned HTML
NSString *result = [[NSString alloc] initWithData:receivedData encoding:NSASCIIStringEncoding];
NSError *error = nil;
NSString *pattern = @"description.*?h4>(.*?)<\\/h4>.*?\"address>[ \\s]*(.*?)<.*?zip>.*?(\\d{5,5}), US<";
NSRegularExpression *regex = [NSRegularExpression
regularExpressionWithPattern:pattern
options:NSRegularExpressionDotMatchesLineSeparators
error:&error];
__block NSUInteger counter = 0;
// the application hangs on the next line after 1-2 times through
[regex enumerateMatchesInString:result options:0 range:NSMakeRange(0, [result length]) usingBlock:^(NSTextCheckingResult *match, NSMatchingFlags flags, BOOL *stop){
NSRange range = [match rangeAtIndex:2];
NSString *streetAddress =[result substringWithRange:range];
range = [match rangeAtIndex:3];
NSString *cityStateZip = [result substringWithRange:range];
NSString *address = [NSString stringWithFormat:@"%@ %@", streetAddress, cityStateZip];
EKItemInfo *party = [self addItem:address]; // geocode address and then map it
if (++counter > 4) *stop = true;
}];
[receivedData release];
[result release];
[connection release]; //alloc'd previously, so release here.
}
我意识到这将很难/不可能复制,但我想知道是否有人遇到过与 NSRegularExpression 类似的问题,或者这里是否有明显的错误。
最佳答案
我也遇到过正则表达式异常。就我而言,问题是字符编码。以至于我写了一段代码去配合几种字符编码。也许这段代码对你有帮助。
+ (NSString *)encodedStringWithContentsOfURL:(NSURL *)url
{
// Get the web page HTML
NSData *data = [NSData dataWithContentsOfURL:url];
// response
int enc_arr[] = {
NSUTF8StringEncoding, // UTF-8
NSShiftJISStringEncoding, // Shift_JIS
NSJapaneseEUCStringEncoding, // EUC-JP
NSISO2022JPStringEncoding, // JIS
NSUnicodeStringEncoding, // Unicode
NSASCIIStringEncoding // ASCII
};
NSString *data_str = nil;
int max = sizeof(enc_arr) / sizeof(enc_arr[0]);
for (int i=0; i<max; i++) {
data_str = [
[NSString alloc]
initWithData : data
encoding : enc_arr[i]
];
if (data_str!=nil) {
break;
}
}
return data_str;
}
您可以从 GitHub 下载整个类别库并运行它。希望对您有所帮助。
关于objective-c - NS正则表达式 :enumerateMatchesInString hangs when called more than once,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6434869/
我正在调用上述函数,它正确地遍历所有匹配项。但是,在处理完所有匹配的 block 后,它并没有完成执行。我可能做错了什么? 使用的正则表达式是:/\[([^\[\{,]*(,\n)?)*\]/ 最佳答
在我正在开发的 iPhone 应用程序的上下文中,我正在使用 NSRegularExpression 解析一些 html 以提取要映射的数据。每当用户将 map “平移”到新位置时,此信息就会更新。
我是一名优秀的程序员,十分优秀!