从 NSString 获取值

Posted

技术标签:

【中文标题】从 NSString 获取值【英文标题】:Get value from the NSString 【发布时间】:2017-07-29 07:09:52 【问题描述】:

从服务器获取复杂的字符串

@"a:3:i:0;s:4:\"3530\";i:1;s:4:\"3532\";i:2;s:4:\"4503\";"

我需要上面字符串中的所有 ID,例如

["3530", "3532", "4503"]

我怎样才能得到以上的输出?我知道componentsSeparatedByString 将字符串拆分为数组并得到我的结果的一种方法。

但我认为这不是好方法。那么你能建议我在正确的方向和RGEX 或 ETC 吗?

注意:它不是 JSON 字符串,因此我们无法将其转换为 ArrayDictionary


我的逻辑得到了预期的结果。但我不喜欢像下面那样做。

更新:

 NSString *temStringValue = @"a:3:i:0;s:4:\"3530\";i:1;s:4:\"3532\";i:2;s:4:\"4503\";";
    NSArray * arrSplit = [temStringValue componentsSeparatedByString:@"4:\""];
    NSMutableArray *finalArray = [[NSMutableArray alloc] init];
    if(arrSplit.count > 0 )
        for (NSString *strInner in arrSplit) 
            NSArray * arrSplit2 = [strInner componentsSeparatedByString:@"\""];
            NSLog(@"%@", arrSplit2);
            [finalArray addObject:[arrSplit2 objectAtIndex:0]];
        
    

    [finalArray removeObjectAtIndex:0];
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:finalArray options:NSJSONWritingPrettyPrinted error:nil];
    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    NSLog(@"%@", jsonString

输出

[
  "3530",
  "3532",
  "4503"
]

那么有人有好的想法吗?

【问题讨论】:

是字典吗? 不,是字符串。如果有字典,那么我们很容易得到结果。 您的代码看起来不错。如果它有效,并且单元测试通过,则继续处理另一个问题。当然,正则表达式可以在这里工作,但它在运行时可能会比我们的解决方案慢,并且未来的开发人员可能会发现正则表达式难以理解和调试。 (阅读其他开发人员的正则表达式通常很困难,除非他们得到很好的评论) 【参考方案1】:

这是使用正则表达式的解决方案

该模式搜索一个双引号,后跟一个或多个非双引号字符和第二个双引号。双引号之间的字符被捕获在一个组中。

NSString* input = @"a:3:i:0;s:4:\"3530\";i:1;s:4:\"3532\";i:2;s:4:\"4503\";";
NSString *pattern = @"\"([^\"]+)\"";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:nil];
NSArray *matches = [regex matchesInString:input options:0 range:NSMakeRange(0, input.length)];
NSMutableArray *result = [[NSMutableArray alloc] init];
for (NSTextCheckingResult *match in matches) 
    [result addObject: [input substringWithRange:[match rangeAtIndex:1]]];

NSLog(@"%@", result);

【讨论】:

【参考方案2】:

试试这个代码

NSString *temStringValue = @"a:3:i:0;s:4:\"3530\";i:1;s:4:\"3532\";i:2;s:4:\"4503\";";
    NSMutableArray * arrSplit = [[temStringValue componentsSeparatedByString:@"\""] mutableCopy];
    NSMutableArray *output = [NSMutableArray new];
    [arrSplit removeLastObject];
    [arrSplit enumerateObjectsUsingBlock:^(id  _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) 
        if ( [(NSString *)obj containsString:@"s:4"] == false ) 
            [output addObject:obj];
        
    ];
    NSLog(@"%@",output);

输出

(
3530,
3532,
4503
)

【讨论】:

【参考方案3】:

由于您要查找的值是" 之间的唯一值,因此您可以使用非常简单的正则表达式。

NSString *yourString = @"a:3:i:0;s:4:\"3530\";i:1;s:4:\"3532\";i:2;s:4:\"4503\";";

// Find occurrences of integer numbers between double quotes.
NSRegularExpression* regex = [[NSRegularExpression alloc] initWithPattern:@"\"([0-9]+)\"" options:0 error:nil];
NSRange range = NSMakeRange(0, [yourString length]);
NSArray* matches = [regex matchesInString:yourString options:0 range:range];

// Extract the found occurrences as strings.
NSMutableArray* output = [NSMutableArray new];
for (NSTextCheckingResult* match in matches)

    [output addObject: [yourString substringWithRange:[match rangeAtIndex:1]]];

【讨论】:

以上是关于从 NSString 获取值的主要内容,如果未能解决你的问题,请参考以下文章

如何在 NSString/String 数组中获取最小值和最大值?

nsnumber 类型的 json 值“2”无法转换为 nsstring

xcode 如何从 NSURL 获取 NSString

无法在 Swift 2 中将“__NSCFNumber”类型的值转换为“NSString”

如何从 NSString 获取整数的数字?

解析NSString数据-获取空值