如何从整个字符串范围的字符串中提取子字符串并将它们放入数组中?

How to extract sub string from a String for the entire range of string and put them in an array?

我有字符串

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"]

我发现可以使用范围 属性

获取子字符串
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(any space + any Number)".
组 我们在模式中使用额外的括号来定义 "groups".
我们枚举匹配项,由于我们之前定义了组,我们可以使用找到的 NSTextCheckingResult 中的 rangeAtIndex: 来轻松获取字母和数字。
然后我们将它存入一个NSDictionary
.

可以根据需要更换什么

删除spacebefore/after号码列表:

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"
    );
}

或删除所有 spaces:

NSString *numbers = [[str substringWithRange:[result rangeAtIndex:2]] stringByReplacingOccurrencesOfString:@" " withString:@""];

给出:

$>Dict: {
    C =     (
        56789123,
        56789123
    );
    M =     (
        22,
        12
    );
}