3

我使用 NSDataDetector 得到了奇怪的结果,我正在寻找它是如何工作的洞察力。

它是与内部数据库匹配还是使用任何分离算法来检测字符串中的单独字段?

目前,我正在使用以下代码来检测地址的字段:

NSDataDetector *address = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeAddress error:nil];
NSArray* matcheslinkaa = [address  matchesInString:inputString options:0 range:NSMakeRange(0, [inputString length])];
if ([matcheslinkaa count]>0) 
{
    for (NSTextCheckingResult *match in matcheslinkaa) 
    {
        if ([match resultType] == NSTextCheckingTypeAddress) 
        {
            NSDictionary *phoneNumber = [match addressComponents];
            NSLog(@"addressComponents  %@",phoneNumber);
        }
    }
}

以下是使用上述代码的一组输入字符串及其各自的输出示例:

inputString = @"100 Main Street\n"  
               "Anytown, NY 12345\n"
               "USA";
// prints:
// addressComponents  {
//     City = Anytown;
//     Country = USA;
//     State = NY;
//     Street = "100 Main Street";
//     ZIP = 12345;
// }

inputString = @"A-205 Natasha Golf View\n"
               "2 Inner Ring Road\n"
               "Bangalore\n"
               "560071\n"
               "Karnataka";
// prints:
// addressComponents  {
//     City = Bangalore;
//     Street = "2 Inner Ring Road";
//     ZIP = 560071;
// }

inputString = @"A-205 Natasha Golf View\n"
               "2 Inner Ring Road\n"
               "Domlur\n"
               "Bangalore\n"
               "560071\n"
               "India";

// prints:
// addressComponents  {
//     City = Bangalore;
//     Street = "2 Inner Ring Road";
//     ZIP = 560071;
// }

inputString = @"Dak Bhavan\n"
               "Parliament Street\n"
               "NEW DELHI 110001\n"
               "INDIA";

// => `addressComponents` is empty!

如您所见,NSDataDetector 提取美国地址没有问题。为什么印度地址的情况如此糟糕,甚至找不到国家名称?

4

2 回答 2

1

你可以试试这个。

[detector enumerateMatchesInString:str
                         options:0 
                           range:NSMakeRange(0, [str length]) 
                      usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop) {

            
                NSDictionary *phoneNumber = [result addressComponents];
                NSLog(@"addressComponents  %@",phoneNumber);
            

                      }];

如果这对您不起作用...地址应采用以下格式

100 Main Street
Anytown, NY 12345
USA

您可以尝试其他替代方案..可能是将您的“str”转换为上述格式...

或者直接你可以试试这个..

 NSArray *array = [tempAddrStr componentsSeparatedByString:@","];
        if([array count]>2)
        {
            NSString *str1 = [array objectAtIndex:[array count]-3];
            NSString *str2 = [array objectAtIndex:[array count]-2];
            str1=[str1 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
            str1=[str1 stringByReplacingOccurrencesOfString:@"\n" withString:@" "];
            str2=[str2 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
            str2=[str2 stringByReplacingOccurrencesOfString:@"\n" withString:@" "];

            tempAddrStr=[NSString stringWithFormat:@"%@, %@",str1,str2];
        }
        else if([tempAddrStr length]>=140&&[array count]>1)
        {
            NSString *str1 = [array objectAtIndex:[array count]-2];
            NSString *str2 = [array objectAtIndex:[array count]-1];
            str1=[str1 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
            str1=[str1 stringByReplacingOccurrencesOfString:@"\n" withString:@" "];
            str2=[str2 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
            str2=[str2 stringByReplacingOccurrencesOfString:@"\n" withString:@" "];

            tempAddrStr=[NSString stringWithFormat:@"%@, %@",str1,str2];
        }

这是我项目的一部分代码,用于从 CLGeocoder 返回的给定地址获取州和城市。

于 2012-01-04T09:32:07.360 回答
1
于 2012-01-07T15:31:16.807 回答