【问题标题】:NSString parsing for specific valuesNSString 解析特定值
【发布时间】:2013-07-31 02:59:46
【问题描述】:

我有一个 NSString,它返回如下值列表:

test_1=value_1  
test/2=value_2  
test3=value_3 value_4  
test_4=value_5/value_6  
...  

更真实的结果值:

inameX=vlan2    
hname=server    
lanipaddr=192.168.1.1    
lannetmask=255.255.255.0    
islan=0    
islwan=0    
dhcplease=604800    
dhcplease_1=302400  
ct_tcp_timeout=0 1200 40 30 60 60 5 30 15 0
ct_timeout=10 10
ct_udp_timeout=25 60
ctf_disable=1    
ddnsx0=
cifs2=0<\\192.168.1.5
and so on...   

如果我这样做:

 for (id key in dict) {
            NSLog(@"key: %@, value: %@", [dict objectForKey:key], key);
        }

它输出:

key: inameX, value: vlan2
key: hname value: server    
key: lanipaddr value: 192.168.1.1    
key: lannetmask value: 255.255.255.0 

这个列表存储在一个 NSString *result 中。不知道我是否应该为此将它放入一个数组中,但我需要能够调用一个函数或命令,该函数或命令将根据参数返回一个特定的 value_X 以匹配变量。例如,获取 test_1 变量的值,然后它将返回 value_1。或者获取 test_4 然后它会返回 value_5/value_6

知道我该怎么做吗?

感谢您的帮助。谢谢!

【问题讨论】:

  • 听起来像是家庭作业。您能否更清楚地说明您要做什么,我将尝试列出如何完成它的步骤?你到底是什么输入和输出?您是否应该为运算符 (*/-+) 解析字符串?您如何确定一个测试何时结束,下一个测试何时开始?
  • 不是家庭作业。我只是想学习与 Linux 服务器交互并通过执行命令来获取值。特定命令的输出将显示为我最初写入 NSString。我只想说 get value of test_1 这样我就可以将它输出到 UILabel value_1 我发送 NSString *result = [ConnectIt executeIt:TextBox.text];结果如上表所示。值可以是整数或某个名称
  • @JeffCompton 对解析列表的任何帮助将不胜感激。

标签: objective-c cocoa-touch nsstring


【解决方案1】:

您可能希望 NSString 中名为 componentsSeparatedByCharactersInSet: 的方法将该字符串拆分为一个数组。由于您的值由 '=' 和换行符 ('\n') 分隔,因此您希望集合包含这两个字符:

NSArray *strings = [NSString componentsSeparatedByCharactersInSet:
                        [NSCharacterSet characterSetWithCharactersInString:@"=\n"]];

然后你可以用 NSDictoinary 的dictionaryWithObjects: AndKeys: 把它变成一个字典但是首先,你需要把这个数组分成两个数组;一个带对象,一个带键:

 NSMutableArray *keys = [NSMutableArray new];
    NSMutableArray *values = [NSMutableArray new];
    for (int i = 0; i < strings.count; i++) {
        if (i % 2 == 0) { // if i is even
            [keys addObject:strings[i]];
        }
        else {
            [values addObject:strings[i]];
        }
    }

然后将它们放入NSDictonary

NSDictionary *dict = [NSDictionary dictionaryWithObjects:values forKeys:keys];
NSLog(@"%@", dict[@"test_1"])  // This should print out 'value_1'

希望有帮助!

【讨论】:

  • 你是对的,我忽略了该方法使用的对象,修复了它。但是我正在使用一个对象创建一个 NSSet,@['=','\n'] 是一个 NSArray 对象。
  • 这不起作用。我得到糟糕的执行官。 NSString *result = [ConnectIt executeIt:TextBox.text];NSArray *strings = [result componentsSeparatedByCharactersInSet: [NSCharacterSet characterSetWithCharactersInString:@"=\n"]];NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:strings];NSLog(@"%@", dict[@"test_1"]);
  • 最后的编辑应该适合你。我忘了你不能在dictionaryWithObjectsAndKeys: 中放一个数组。
  • 我跑了一次,它给了我基于 dict[@"test_1"] 的正确值。我将其更改为 dict[@"test_2"] 但它输出(null)。有什么想法吗?
  • 从结果中输出的示例列表:inameX=vlan2 lanipaddr=192.168.1.1 islan=0 dhcplease=604800 我想说让我得到 inameX 的值,然后输出是 vlan2 如果我要求 dhcplease,那么输出是 604800
【解决方案2】:

使用 NSDicationary。 NSDictionaries 是键值存储。换句话说,有一个键列表。每把钥匙都是独一无二的。每个键都有一个关联的值。值可以是任何数据类型,并且键必须符合 NSCopying 协议(通常是 NSString)。如果您尝试访问 NSDictionary 中不存在的键的值,则返回值将为 nil。

//create the dictionary and populate it
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[dict setObject:@"value_1" forKey:@"key_1"];
[dict setObject:@"value_2" forKey:@"key_2"];
[dict setObject:@"value_3" forKey:@"key_3"];
[dict setObject:@"value_4" forKey:@"key_4"];


NSString *stringInput = [self getStringInput];//however you find out your input

//find your string value based on the key passed in
NSString *strValue = [dict objectForKey:stringInput];

【讨论】:

  • 我可以使用它,但这些值会动态变化,这意味着 test_1 现在将具有 value_1,但如果我重新加载数据,则在 5 分钟后 value_8。基本上每次我重新加载 NSString *result 时,它都会有一个包含相同变量但具有不同值的列表。
  • @Squirrel NSMutableDictionary... 我不明白为什么数组更适合实现可变字典。
  • 我认为您的意思是setObject:forKey:,而不是setValue:forKey:,并且密钥不必是NSString;它只需要符合 NSCopying 协议。
  • @AaronBrager setValue:forKey: 很好。
  • 我很好奇有什么不同。对于其他好奇的人:stackoverflow.com/questions/1249634/…
【解决方案3】:

您可以使用 NSScanner 来完成这项工作。

扫描您想要其值的字符串,然后扫描该字符串直到遇到\n,然后将其用于您的要求。

NSScanner *scan =[NSScanner scannerWithString:theString];
[scan scanString:keyString inToString:nil];
[scan setScanLocation:[scan scanLocation]+1];

[scan scanString:@"\n" inToString:requiredString];

所以 requiredString 是你想要的字符串。

【讨论】:

    猜你喜欢
    • 2012-02-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-22
    • 1970-01-01
    • 1970-01-01
    • 2020-10-16
    • 2012-04-29
    • 1970-01-01
    相关资源
    最近更新 更多