0

我从一个文本文件中创建了一个名为 NSArray urbanList 的数组,该文件用行尾的“,”分隔每个对象。这是文本文件中原始数据的样子。

City:San Jose|County:Santa Clara|Pop:945942,
City:San Francisco|County:San Francisco|Pop:805235,
City:Oakland|County:Alameda|Pop:390724,
City:Fremont|County:Alameda|Pop:214089,
City:Santa Rosa|County:Sonoma|Pop:167815,

cityList 数组很好(我可以看到计数对象,查看数据等)现在我想解析出每个数组对象中的 city 和 Pop:。我假设您创建了一个 for 循环来遍历对象,所以如果我想创建一个名为 cityNames 的可变数组来仅将城市名称填充到该数组中,我将使用这种 for 循环:

SMutableArray *cityNames = [NSMutableArray array];
    for (NSString *i in citiesList) {
        [cityNames addObject:[???]];
    }

我的问题是我应该使用什么查询来从数组中的对象中仅查找 City: San Francisco?

4

4 回答 4

2

如果您真的想构造一个算法来解析字符串,这里的答案中有很多很好的建议。

作为替代方案,您也可以将其视为声明数据结构的问题,然后让系统进行解析。对于像你这样的情况,正则表达式会很好地做到这一点。您是否喜欢以一种方式或另一种方式在很大程度上取决于品味和编码标准。

在您的特定情况下(如果您需要从字符串中提取城市名称),那么还要注意有一些可用的快捷方式可以将其变成单行解决方案:匹配整个字符串,定义一个单个捕获组并将其替换为一个新字符串:

NSString *city = [i stringByReplacingOccurrencesOfString: @".*City:(.*?)\\|.*"
                                              withString: @"$1"
                                                 options: NSRegularExpressionSearch
                                                   range: NSMakeRange(0, row.length)];

该变量i与您在 for 循环中定义的变量相同,即包含表示输入文件中一行的字符串的字符串:

City:San Jose|County:Santa Clara|Pop:945942,

我添加了首字母.*以使模式对将来添加到行的新字段具有鲁棒性。如果你不喜欢它,你可以删除它。

替换字符串中的$1代表第一个捕获组,即正则表达式模式中的括号。在这种特定情况下,包含城市名称的子字符串。如果有更多的捕获组,它们将被命名为 2-9 美元。如果您想了解更多信息,可以查看有关 NSRegularExpression 和 NSString 的文档。

正则表达式是他们自己的一个话题,并不局限于 Cocoa,尽管所有平台都使用具有自己特性的正则表达式实现。

于 2013-08-07T22:33:13.130 回答
2

您可以继续使用componentsSeparatedByString来划分部分和键/值对。或者您可以使用 anNSScanner来读取解析出键/值对的字符串。您可以使用rangeOfString查找“|” 然后提取一个范围。这么多选择。

于 2013-08-07T21:50:24.557 回答
1
for (NSString *i in citiesList) {
  // Divide each city into an array, where object 0 is the name, 1 is county, 2 is pop
  NSArray *stringComponents = [i componentsSeparatedByString:@"|"];
  // Remove "City:" from string and add the city name to the array
  NSString *cityName = [[stringComponents objectAtIndex:0] stringByReplacingCharactersInRange:NSMakeRange(0, 5) withString:@""];
  [cityNames addObject:cityName];
}
于 2013-08-07T22:03:52.753 回答
1

你想使用componentsSeparatedByString:如下。(这些行不进行错误检查)

NSArray *fields = [i componentsSeparatedByString:@"|"];
NSString *city = [[[fields objectAtIndex:0] componentsSeparatedByString:@":"] objectAtIndex:1];
NSString *county = [[[fields objectAtIndex:1] componentsSeparatedByString:@":"] objectAtIndex:1];

如果您可以删除键,以及像这样的几个分隔符:

San Jose|Santa Clara|945942
San Francisco|San Francisco|805235
Oakland|Alameda|390724
Fremont|Alameda|214089
Santa Rosa|Sonoma|167815

然后你可以简化代码(仍然没有错误检查):

NSArray *fields = [i componentsSeparatedByString:@"|"];
NSString *city = [fields objectAtIndex:0];
NSString *county = [fields objectAtIndex:1];
于 2013-08-07T21:55:08.573 回答