如何在一定数量的字符后将NSString拆分为多个字符串

时间:2013-05-10 17:12:56

标签: ios objective-c nsstring

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

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

我想要做的是:将1000个字符拆分为多个字符串。每个字符串必须只有MAX 100个字符。

接下来的问题是如何检查最后一个单词在100个字符之前完成的时间,所以我不在单词的中间执行拆分?

4 个答案:

答案 0 :(得分:1)

基于正则表达式的解决方案:

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]];
}

正则表达式和matches部分的代码直接来自docs,因此唯一的区别是模式。

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

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

请注意,该算法不能处理超过100个字符的“单词” - 它将为您提供最后100个字符并删除第一部分,但这应该是一个极端情况。

答案 1 :(得分:0)

(假设您的单词由单个空格分隔,否则使用rangeOfCharacterFromSet:options:range:

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

一起使用
  1. aString as @“”
  2. maskNSBackwardsSearch
  3. 然后你需要一个循环,在那里你检查你还没有到达字符串的末尾,然后创建一个范围(用作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));
    }
    

答案 2 :(得分: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;
}

答案 3 :(得分:-1)

使用NSArray *words = [stringFromServer componentsSeparatedBy:@" "]; 这会给你发言。

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