2013-04-24 35 views
0

下面是用逗号分隔的字符串的两个例子,我回来的结果逗号列提取:的NSString:从分离的NSString

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

或有时结果包含地名:

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

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

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

NSLog (@"%s", placeResult); 

日志会打印:

"222 Main Street, Cupertino, CA" 

另一个字符串现在将存储@ “星巴克” 在它:

NSLog (@"%s", placeName); 

日志将打印:

"Starbucks" 

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

谢谢!

回答

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 
     } 
    } 
} 

此输出:

地址= {
市=库珀蒂诺;
State = CA;
Street =“222 Main Street”;
},范围:{11,30}

奇怪的是,所得到的结果的字典不包含对“星巴克”部分的参考。您可以执行的操作是查看addressComponents包含的值为NSTextCheckingNameKey。如果不是,请检查比赛的范围。如果匹配范围不是字符串的开头,则可以使用该值从字符串的开头提取名称。

+0

非常简洁明智的做法。我不知道你可以做NSTextCheckingTypeAddress。问题:如果NSTextCheckingNameKey是空白的,为什么我需要检查比赛的范围? – user1107173 2013-04-24 22:49:33

+0

看看我的答案中的例子。该地址不包含名称“星巴克”。由于“NSTextCheckingNameKey”没有值,所以您需要查看字符串开头是否真的有名称。你可以通过查看比赛的范围来做到这一点。如果它不是零,那么你可以假定字符串的开始直到那个匹配范围是一个被忽视的名字。但是,这一切都取决于你需要解析的字符串。 – rmaddy 2013-04-24 22:53:41

+0

对不起,我还是很困惑。我试图从谷歌地点自动填充。它以我的问题的格式返回地址。我刚刚运行了你的代码,你说得对,没有提及“星巴克”。你能否详细说明一下:“看看字符串的开头是否有名字,你可以通过查看匹配的范围来做到这一点,如果它不是零,那么你可以假设字符串的起始位置是匹配范围是一个被忽视的名字。“在这一点上,我只是试图解析(@“星巴克,加利福尼亚州库比蒂诺市222大街”);显然,星巴克是第一个字符串。 – user1107173 2013-04-24 23:46:36

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工作,你可能会想添加在你开始假设你可以从第二个开始创建一个数组之前,确保你至少有两个组件。