从 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
字符串,因此我们无法将其转换为 Array
或 Dictionary
。
我的逻辑得到了预期的结果。但我不喜欢像下面那样做。
更新:
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