【问题标题】:How to Split NSString to multiple Strings after certain number of characters如何在一定数量的字符后将 NSString 拆分为多个字符串
【发布时间】:2013-05-10 17:12:56
【问题描述】:

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

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

我想要做的是:将 1000 个字符拆分为多个字符串。每个字符串最多只能包含 100 个字符。

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

【问题讨论】:

    标签: ios objective-c nsstring


    【解决方案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 个字符并删除第一部分,但这应该是一个极端情况。

    【讨论】:

    • 如果我要拆分的字符串只有 180 个字符,它将拆分为两个字符串。只有一个问题,如果我写了 60 个字符并按回车键或回车键,它会将第一个字符串拆分为 60 个字符。所以 180 将被分成三个字符串。知道如何解决吗? @Monolo
    • @iMubarak 如果我正确理解您的问题,如果尚未达到 60 个字符,您希望它不会在换行符处中断。如果是这样,只需在模式中添加一个 s 标志。我已经更新了答案。
    • 这正是我想要的。非常感谢您的回复。最后一件事,如果用户键入 60 个字符并想要剪切行,他只需键入类似 // 或其他的东西,如何让它由用户控制。那可能吗?最后一件事,有没有解释reges的网站?非常感谢。 @Monolo
    • @iMubarak 使用正则表达式当然可以,但听起来问题比您对它的第一次描述更复杂,然后正则表达式可能不是最合适的。无论如何,一个好的正则表达式站点是:regular-expressions.info/tutorial.html
    • 整个概念是让用户键入或粘贴任何文本,然后应用程序将输入拆分为每个字符串最多 100 个字符。一切正常。我只想添加此功能,用户可以在达到 100 之前进行拆分。就像返回键在您上次编辑之前所做的那样。 @Monolo
    【解决方案2】:

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

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

    1. aString as @" "
    2. maskNSBackwardsSearch

    然后您需要一个循环,在其中检查您是否还没有到达字符串的末尾,然后创建一个范围(用作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));
    }
    

    【讨论】:

    • 能否提供示例代码或任何教程链接?谢谢@Wain
    【解决方案3】:

    这会有所帮助

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

    【讨论】:

      【解决方案4】:

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

      如果您确实需要使其最接近 100 个字符,请开始附加字符串,保持附加字符串的总长度并检查它是否应保持在

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-11-02
        相关资源
        最近更新 更多