iphone sdk中nsdata检测器的内部功能是什么

iphone sdk中nsdata检测器的内部功能是什么,iphone,ios4,street-address,nsdatadetector,Iphone,Ios4,Street Address,Nsdatadetector,我使用NSDataDetector得到了奇怪的结果,我希望了解它是如何工作的 它是与内部数据库匹配还是使用任何分离算法来检测字符串中的独立字段 目前,我正在使用以下代码检测地址字段: NSDataDetector *address = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeAddress error:nil]; NSArray* matcheslinkaa = [address matchesInString:input

我使用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提取美国地址没有问题。为什么印度地址的情况如此糟糕,以至于连国名都找不到?

你能试试这个吗

[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返回的给定地址获取州和城市。

免责声明 我无法告诉您它是如何工作的-事实上,
NSDataDetector
继承了
NSRegularExpression
可能表明它使用了一组正则表达式,但我确实怀疑这一点(例如,日期类型检测器使用散布在较长文本块中的信息,因此更可能存在某种自然语言聚类和处理)

我想,它能更好地处理美国地址的主要原因很简单,也很无聊:

苹果是一家美国公司(英国人乔纳森·艾夫除外),其每一位高层管理人员都是北美人。因此,他们的做法是“美国/北美优先”[1]也就不足为奇了

这就是为什么电源砖的设计在使用紧凑型美国连接器(插脚折叠的地方)时如此优雅的原因——并且与几乎任何其他连接器相比看起来如此笨拙

另一个原因是苹果和其他任何公司一样,会尽快发货:
如果他们有适合美国客户但不适合其他客户的产品,为什么不为他们发货,并在以后通过软件更新添加对其他地区的支持

关于您的问题,在地址检测方面可能有帮助,也可能没有帮助(阅读:“我没有费心测试”)的是,用户适当地设置了他们设备的区域设置

如果(且仅当)您发现这对您的结果有积极影响,您就可以检查
[[NSLocale currentLocale]localeIdentifier]
中的国家/地区部分是否等于
,并且(如果没有)在“设置”应用程序中提示用户更改,否则

如果这证明没有用,你必须自己动手™...



(1) 这条规则的一个显著的例外是选择了原始iPhone的基带技术,支持GSM而不是CDMA可能是本地的一个劣势,但却是全球成功的关键。

这很好……但我认为这对我的项目来说是不可能的。我无法确定单独的字符应该是“,”可能是这样。我使用OCR技术从图像中获取数据。然后我必须使用我们自己的ASUTIMONS进行解析。我用一个包含50个地址的文件进行了测试(我有我的国家、德国和其他一些欧洲国家的地址)。苹果似乎把重点放在了美国。我的结果并没有因为改变了地区而改变。我不是100%确定,但我可以说95%的地区并没有影响结果。我猜苹果选择了我们的地址,因为这比我们在欧洲的地址要容易得多。我现在也有这个痛苦的问题。。。如果我通过贝弗利希尔,MI通过探测器,它没有检测到正确的地址,但如果我通过旧金山,CA它!WTF苹果!你不能与我们的地址一致吗?