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

问题描述 投票:-1回答:1

我有字符串

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是任意随机的。如何解决整个字符串长度并将其放入数组?

ios objective-c arrays string nsstring
1个回答
1
投票

工作方案:

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
    );
}
© www.soinside.com 2019 - 2024. All rights reserved.