Objective c NSRegularExpression:EnumerateMatcheInstalling在多次调用时挂起

Objective c NSRegularExpression:EnumerateMatcheInstalling在多次调用时挂起,objective-c,regex,ios4,Objective C,Regex,Ios4,在我正在开发的iPhone应用程序的上下文中,我正在使用NSRegularExpression解析一些html以提取要映射的数据。每当用户将地图“平移”到新位置时,此信息都会更新 这在第一次或第二次到第三次调用函数时都可以正常工作,但在第二次或第三次调用函数时,应用程序会挂起。我已经使用XCode的探查器确认我没有泄漏内存,并且没有生成错误(应用程序没有终止,它只是在如下所示的点执行) 当我检查正在解析的HTML时,我看不到它是不完整的,或者在应用程序挂起时有其他乱码 此外,如果我用显式地址字符

在我正在开发的iPhone应用程序的上下文中,我正在使用NSRegularExpression解析一些html以提取要映射的数据。每当用户将地图“平移”到新位置时,此信息都会更新

这在第一次或第二次到第三次调用函数时都可以正常工作,但在第二次或第三次调用函数时,应用程序会挂起。我已经使用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.
}
-(void)连接dFinishLoading:(NSURLConnection*)连接{
//receivedData包含返回的HTML
NSString*result=[[NSString alloc]initWithData:receivedData encoding:NSASCIIStringEncoding];
n错误*错误=nil;

NSString*pattern=@“description.*?h4>(.*?.*?.\”address>[\\s]*(.*?.*)(\\d{5,5}),US我也遇到了正则表达式异常。在我的例子中,问题是字符编码。因此我编写了一个与多个字符编码相匹配的代码。也许这段代码可以帮助您

+ (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;    
}
+(NSString*)encodedStringWithContentsOfURL:(NSURL*)url
{
//获取网页HTML
NSData*data=[NSData dataWithContentsOfURL:url];
//回应
int enc_arr[]={
NSUTF8StringEncoding,//UTF-8
NSShiftJISStringEncoding,//Shift\u JIS
NSJapaneseEUCStringEncoding,//EUC-JP
NSISO2022JPStringEncoding,//JIS
NSU编码,//Unicode
NSASCIIStringEncoding//ASCII
};
NSString*data_str=nil;
int max=sizeof(enc_arr)/sizeof(enc_arr[0]);

对于(int i=0;i,这个问题的答案可以在:


通过将NSMatchingReportCompletion作为选项传递,并在匹配为零时将stop设置为YES,我解决了这个问题。

您可以共享接收到的HTML吗?结果表明,返回的HTML实际上并不是我所期望的。我将修改该问题,并在进一步了解后发布答案,因为我仍然不清楚r关于为什么正则表达式只是旋转它的轮子。所以你在块中设置了一个断点,而它没有执行?我想我可能已经看到了一个无效的范围。还要注意修改你正在迭代的字符串…我将重复@Rajeev request。你能分享收到的html吗?