2013-04-24 48 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工作,你可能會想添加在你開始假設你可以從第二個開始創建一個數組之前,確保你至少有兩個組件。