0

下面是我作为结果返回的两个用逗号分隔的字符串示例:

NSString *placeResult = @"111 Main Street, Cupertino, CA"

或者有时结果包含一个地点的名称:

NSString *placeResult = @"Starbucks, 222 Main Street, Cupertino, CA"

检查上面的字符串以查看它是否以名称或街道地址开头的最佳方法是什么?

如果它确实以名称开头(即上面第二个示例中的星巴克“),我想提取名称并将其存储到另一个变量中。因此提取后的字符串将是:

NSLog (@"%s", placeResult);

日志将打印:

"222 Main Street, Cupertino, CA" 

另一个字符串现在将在其中存储@"Starbucks":

NSLog (@"%s", placeName);

日志将打印:

"Starbucks" 

重要提示:提取后我不能丢失逗号分隔。

谢谢!

4

2 回答 2

5

使用NSDataDetectorNSTextCheckingResult

NSDataDetector *detector = [NSDataDetector dataDetectorWithTypes:NSTextCheckingTypeAddress error:nil];
NSString *str = @"Starbucks, 222 Main Street, Cupertino, CA";
NSArray *matches = [detector matchesInString:str options:0 range:NSMakeRange(0, str.length)];
for (NSTextCheckingResult *match in matches) {
    if (match.resultType == NSTextCheckingTypeAddress) {
        NSDictionary *data = [match addressComponents];
        NSLog(@"address = %@, range: %@", data, NSStringFromRange(match.range));

        NSString *name = data[NSTextCheckingNameKey];
        if (!name && match.range.location > 0) {
            name = [str substringToIndex:match.range.location - 1];
            // "name" may now include a trailing comma and space - strip these as needed
        }
    }
}

这输出:

地址={
城市=库比蒂诺;
状态 = CA;
街道 = "222 大街";
},范围:{11, 30}

奇怪的是,结果字典不包含对“星巴克”部分的引用。您可以做的是检查是否addressComponents包含NSTextCheckingNameKey. 如果不是,请检查匹配范围。如果匹配的范围不是字符串的开头,那么您可以使用该值从字符串的开头提取名称。

于 2013-04-24T22:40:06.653 回答
2

要获取逗号之间的事物数组,您可以使用:

NSArray *components = [placeResult componentsSeparatedByString:@","];

可能会跟进:

NSMutableArray *trimmedComponents =
           [NSMutableArray arrayWithCapacity:[components count]];

NSCharacterSet *whitespaceCharacterSet = [NSCharacterSet whitespaceCharacterSet];

for(NSString *component in components)
    [trimmedComponents addObject:
             [component stringByTrimmingCharactersInSet:whitespaceCharacterSet]];

从每个单独的组件中删除任何前导或尾随空格。您将使用例如反转转换

NSString *fullAddress = [trimmedComponents componentsJoinedByString:@", "];

那么问题是,给定NSString *firstComponent = [trimmedComponents objectAtIndex:0];,您如何猜测它是名称还是街道地址?如果它像检查前面是否有一个不为零的数字那么简单,那么你可以这样做:

if([firstComponent integerValue])
{
    /* ... started with a non-zero number ... */

    NSString *trimmedAddress = [[trimmedComponents subArrayWithRange:
      NSMakeRange(1, [trimmedComponents count]-1)] componentsJoinedByString:", "];

    NSLog(@"trimmed address is: %@");
}

尽管该条件测试也适用于placeResult,但您可能需要添加有效性检查以确保在开始假设您可以从第二个开始创建数组之前至少有两个组件。

于 2013-04-24T22:34:46.660 回答