如何将NSString拆分为多个字符串,达到一定的字符数后再拆分。

问题描述 投票:0回答:4

我正在使用Xcode 4.6.2开发一个iOS应用程序。

我的应用程序从服务器接收例如1000个字符,然后存储在NSString中。

我想做的是:将这1000个字符分割成多个字符串。每个字符串必须是最大100个字符。

下一个问题是如何检查最后一个字何时在100个字符之前完成,这样我就不会在字的中间执行分割?

ios objective-c nsstring
4个回答
1
投票

一个基于regex的解决方案。

NSString *string = // ... your 1000-character input

NSString *pattern = @"(?ws).{1,100}\\b";

NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern: pattern options: 0 error: &error];

NSArray *matches = [regex matchesInString:string options:0 range:NSMakeRange(0, [string length])];

NSMutableArray *result = [NSMutableArray array];                            
for (NSTextCheckingResult *match in matches) {
    [result addObject: [string substringWithRange: match.range]];
}

基于regex的解决方案: regex的代码和... matches 部分直接取自 文件所以唯一的区别就是模式。

该模式基本上可以匹配从1到100个字符的任何内容,直到一个单词的边界。作为一个贪婪的模式,它将提供尽可能长的字符串,同时仍然以一个完整的单词结束。这确保了它不会在中间分割任何单词。

(?ws) 使得单词识别与Unicode的换字符定义(即 w 标志),并将行尾视为任何其他字符(将 s 标志)。)

请注意,该算法并不能很好地处理超过100个字符的 "单词"--它会给你最后100个字符,并放弃第一部分,但这应该是一个角落的情况。


0
投票

(假设你的单词用一个空格隔开,否则用 rangeOfCharacterFromSet:options:range:)

使用 NSString -- (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask range:(NSRange)aRange 与。

  1. aString 作为@" "
  2. mask 作为 NSBackwardsSearch

然后你需要一个循环,检查你是否已经到了字符串的结尾,然后创建一个范围(用于用作 aRange),这样你就可以沿着字符串的100个字符开始,并向后搜索寻找空格。一旦你找到了空格,返回的范围将允许你得到字符串中的 substringWithRange:.

(手写)

NSRange testRange = NSMakeRange(0, MIN(100, sourceString.length));
BOOL complete = NO;
NSMutableArray *lines = [NSMutableArray array];

while (!complete && (testRange.location + testRange.length) < sourceString.length) {
    NSRange hitRange = [sourceString rangeOfString:@"" options:NSBackwardsSearch range:testRange];

    if (hitRange.location != NSNotFound) {
        [lines addObject:[sourceString substringWithRange:hitRange];
    } else {
        complete = YES;
    }

    NSInteger index = hitRange.location + hitRange.length;
    testRange = NSMakeRange(index, MIN(100, sourceString.length - index));
}

0
投票

这可以帮助

- (NSArray *)chunksForString(NSString *)str {
    NSMutableArray *chunks = [[NSMutableArray alloc] init];
    double sizeChunk = 100.0; // or whatever you want
    int length = 0;
    int loopSize = ceil([str length]/sizeChunk);
    for (int index = 0; index < loopSize; index++) {
        NSInteger newRangeEndLimit = ([str length] - length) > sizeChunk ? sizeChunk : ([str length] - length);
        [chunks addObject:[str substringWithRange:NSMakeRange(length, newRangeEndLimit)];
        length += 99; // Minus 1 from the sizeChunk as indexing starts from 0
    }

    return chunks;
}


-1
投票

使用 NSArray *words = [stringFromServer componentsSeparatedBy:@" "];这将为你提供单词。

如果你真的需要使它接近100个字符,开始追加字符串,保持追加字符串的总长度,并检查它应该保持< 100。

© www.soinside.com 2019 - 2024. All rights reserved.