如何从字符串中提取整个字符串范围的子字符串并将它们放在一个数组中?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了如何从字符串中提取整个字符串范围的子字符串并将它们放在一个数组中?相关的知识,希望对你有一定的参考价值。
我有字符串
NSString *str = @"M 2 2 C 5 6 7 8 9 1 2 3M 1 2 C 5 6 7 8 9 1 2 3"
我想要像["2 2","5 6 7 8 9 1 2 3","1 2","5 6 7 8 9 1 2 3"]
这样的子串数组
我想用["M":"2 2", "C":"5 6 7 8 9 1 2 3"]
这样的字典中的类型映射它
我发现可以使用range属性获取子字符串
NSString *str = @"M 2 2 C 5 6 7 8 9 1 2 3M 1 2 C 5 6 7 8 9 1 2 3"
NSRange r1 = [str rangeOfString:@"M"];
NSRange r2 = [str rangeOfString:@"C"];
NSRange rSub = NSMakeRange(r1.location + r1.length, r2.location - r1.location - r1.length);
NSString *sub = [s substringWithRange:rSub];
但是字母M和C是任意随机的。如何解决整个字符串长度并将其放入数组?
答案
工作方案:
NSString *str = @"M 2 2 C 5 6 7 8 9 1 2 3M 1 2 C 5 6 7 8 9 1 2 3";
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"([A-Z])([\\d\\s]*)" options:0 error:nil];
NSMutableDictionary *dict = [[NSMutableDictionary alloc] init];
[regex enumerateMatchesInString:str options:0 range:NSMakeRange(0, [str length]) usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
NSString *letter = [str substringWithRange:[result rangeAtIndex:1]];
NSString *numbers = [str substringWithRange:[result rangeAtIndex:2]];
NSMutableArray *subArray = dict[letter]?dict[letter]:[[NSMutableArray alloc] init];
[subArray addObject:numbers];
[dict setObject:subArray forKey:letter];
}];
NSLog(@"Dict: %@", dict);
输出:
$>Dict: {
C = (
" 5 6 7 8 9 1 2 3",
" 5 6 7 8 9 1 2 3"
);
M = (
" 2 2 ",
" 1 2 "
);
}
这个怎么运作:
我们使用RegularExpression查找“Letter + anyamountof(任何空格+任意数字)”的组。
我们在模式中使用额外的括号来定义“组”。
我们列举了匹配,并且由于我们定义了组的早期,我们可以使用rangeAtIndex:
的NSTextCheckingResult
来轻松获得字母和数字。
然后我们将它存储到NSDictionary
。
根据您的需求可以替换什么
删除号码列表之前/之后的空格:
NSString *numbers = [[str substringWithRange:[result rangeAtIndex:2]] stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
这使:
$>Dict: {
C = (
"5 6 7 8 9 1 2 3",
"5 6 7 8 9 1 2 3"
);
M = (
"2 2",
"1 2"
);
}
或删除所有空格:
NSString *numbers = [[str substringWithRange:[result rangeAtIndex:2]] stringByReplacingOccurrencesOfString:@" " withString:@""];
这使:
$>Dict: {
C = (
56789123,
56789123
);
M = (
22,
12
);
}
以上是关于如何从字符串中提取整个字符串范围的子字符串并将它们放在一个数组中?的主要内容,如果未能解决你的问题,请参考以下文章