【问题标题】:Parse address from NSString without NSDataDetector从没有 NSDataDetector 的 NSString 解析地址
【发布时间】:2014-07-18 11:56:36
【问题描述】:

我一直在使用NSDataDetector 来解析字符串中的地址,并且在大多数情况下它做得很好。但是在与此类似的地址上,它不会检测到它。

6200 North Evan Blvd Suit 487 Highland UT 84043

目前我正在使用此代码:

NSError *error = nil;
NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeAddress error:&error];


NSArray *matches = [detector matchesInString:output options:0 range:NSMakeRange(0, [output length])];

for (NSTextCheckingResult *match in matches) {
    if ([match resultType] == NSTextCheckingTypeAddress) {

        _address = [_tesseractData substringWithRange:[match range]];
        NSDictionary *data = [match addressComponents];

        _zip = [data objectForKey:@"ZIP"];
        if (_zip) {
            NSRange zipRange = [_tesseractData rangeOfString:_zip];
            if (zipRange.location != NSNotFound) {
                [_tesseractData deleteCharactersInRange:zipRange];
            }
        }

        _city = [data objectForKey:@"City"];
        if (_city) {
            NSRange cityRange = [_tesseractData rangeOfString:[_city uppercaseString]];
            if (cityRange.location != NSNotFound) {
                [_tesseractData deleteCharactersInRange:cityRange];
            }
        }
        _city = [_city capitalizedString];

        _state = [data objectForKey:@"State"];

        _street = [data objectForKey:@"Street"];
        if (_street) {
            NSRange streetRange = [_tesseractData rangeOfString:[_street uppercaseString]];
            if (streetRange.location != NSNotFound) {
                [_tesseractData deleteCharactersInRange:streetRange];
            }
        }
        _street = [_street capitalizedString];

    }
}

谁能建议一种更强大的方法来从字符串中解析出物理地址?我需要能够获取 Zip、Street、State 和 City。

【问题讨论】:

  • 您可以尝试使用正则表达式,但这可能会很困难,因为地址以许多不同的格式出现。另一种选择可能是 Web 服务,例如 this answer 中描述的服务

标签: ios objective-c nsdatadetector


【解决方案1】:

您可以尝试使用正则表达式(RegEx)解析地址信息,我认为这是更稳健的方式。请参阅以下参考以使用 RegEx:Making RegEx Easy in Objective-CGitHub 上提供了 Objective-C RegEx 类别。

【讨论】:

    【解决方案2】:

    NSDataDetectorNSRegularExpression 的子类,因此也许您可以创建一个自定义实例,并首先检查 Apple 设置的 patternoptions 参数。


    类似的东西:

    NSDataDetector * dataDetectorRegEx = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeAddress error:&error];
    NSString * dataDetectorPattern = dataDetectorRegEx.pattern;
    NSLog(@"Check out this pattern!: %@", dataDetectorPattern);
    
    // Customize the pattern for your special cases
    NSString * customPattern = [NSString stringWithFormat:@"<MY_OTHER_PATERNS + %@>", dataDetectorPattern];
    NSRegularExpression * customDataDetectorLikeRegEx = [NSRegularExpression regularExpressionWithPattern:customPattern options:someOptions error:&error];
    

    【讨论】:

    • 你能扩展一下吗?
    猜你喜欢
    • 2013-07-07
    • 2015-09-14
    • 1970-01-01
    • 2020-05-23
    • 1970-01-01
    • 2018-12-15
    • 1970-01-01
    • 1970-01-01
    • 2016-10-23
    相关资源
    最近更新 更多