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

Posted

技术标签:

【中文标题】如何从字符串中提取整个字符串范围的子字符串并将它们放入数组中?【英文标题】:How to extract sub string from a String for the entire range of string and put them in an array? 【发布时间】:2017-12-19 11:38:15 【问题描述】:

我有字符串

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

【问题讨论】:

你的字符串是动态的?我的意思是可以是任何字母还是必须是 M 和 C? 在“将其映射为一本字典”?因为后面的字符串包含两个'M',并且字典中只能有一个'M'作为键。 等等……你说I want to an array of substrings like ["2 2","5 6 7 8 9 1 2 3","1 2","5 6 7 8 9 1 2 3"I want to map it with the type in a dictionary like "["M":"2 2", "C":"5 6 7 8 9 1 2 3"]。数组和字典如何关联?正如 Arun 指出的那样,您的示例数据中有两次键“M”,但字典键是唯一的。 您需要更好地定义您的问题。看起来您将字符“M”和“C”视为分割字符串的分隔符,以及输出字典中的键。你需要更清楚地解释你的目标。此外,在您的示例数据中,除了“3M”的一个实例之外,您的所有单个字符都由空格分隔。那是有效的数据,还是应该在“3”和“M”之间有一个空格? 【参考方案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 "
    );

它是如何工作的: 我们使用正则表达式来查找“字母 + anyamountof(任意空格 + 任意数字)”组。 我们在模式中使用额外的括号来定义“组”。 我们枚举匹配项,并且由于我们之前定义了组,我们可以使用找到的NSTextCheckingResult 中的rangeAtIndex: 轻松获得字母和数字。 然后我们将其存储到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
    );

【讨论】:

使用论文信息编辑您的问题,因为这根本不清楚。结果不能成为字典。 dict 没有顺序,不能有重复的键。 我不得不稍微处理一下,RE 是@"([A-Z])([\[0-9][.]\\s]*)",以便它捕获浮点值。我制作了临时字典并将每个字典插入到一个数组中。感谢您的输入。它现在可以工作了。

以上是关于如何从字符串中提取整个字符串范围的子字符串并将它们放入数组中?的主要内容,如果未能解决你的问题,请参考以下文章

如何从字符串中提取单词并将它们存储在c ++中的不同数组中

从字符串中提取单词并将它们移动到数组中

如何使用 PostgreSql 中的子字符串函数从字符串中提取单词

如何从字符串中提取数字?

如何从R中数字之前的字符串中提取大写字母

如何从 C++ 中的 getline 函数中提取特定的子字符串?