我正在使用 Xcode 4.6.2 开发 iOS 应用程序。
我的应用程序从服务器接收到例如 1000 个字符,然后存储在 NSString 中。
我想要做的是:将 1000 个字符拆分为多个字符串。每个字符串最多只能包含 100 个字符。
下一个问题是如何检查最后一个单词在 100 个字符之前完成的时间,所以我不在单词中间执行拆分?
我正在使用 Xcode 4.6.2 开发 iOS 应用程序。
我的应用程序从服务器接收到例如 1000 个字符,然后存储在 NSString 中。
我想要做的是:将 1000 个字符拆分为多个字符串。每个字符串最多只能包含 100 个字符。
下一个问题是如何检查最后一个单词在 100 个字符之前完成的时间,所以我不在单词中间执行拆分?
基于正则表达式的解决方案:
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 个字符并删除第一部分,但这应该是一个极端情况。
(假设您的单词由一个空格分隔,否则使用rangeOfCharacterFromSet:options:range:
)
用于NSString -- (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask range:(NSRange)aRange
:
aString
作为 @” ”mask
作为NSBackwardsSearch
然后你需要一个循环,在其中检查你是否还没有到达字符串的末尾,然后创建一个范围(用于 as 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));
}
这可以帮助
- (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;
}
使用NSArray *words = [stringFromServer componentsSeparatedBy:@" "];
它会给你的话。
如果您确实需要使其最接近 100 个字符,请开始附加字符串,保持附加字符串的总长度,并检查它是否应保持在 < 100。