1

如何从 NSString 中删除前 N 个单词?

比如……“我去商店买牛奶。” 我想删除前三个单词以使其...

“商店买牛奶。” (请注意,“the”一词之前也没有空格)。

谢谢!

4

4 回答 4

3

这个问题可以改写为“我怎样才能得到一个从字符串中的第 4 个单词开始的子字符串?”,这更容易解决。我在这里还假设少于 4 个单词的字符串应该为空。

无论如何,这里的主力是-enumerateSubstringsInRange:options:usingBlock:,我们可以用它来找到第 4 个单词。

NSString *substringFromFourthWord(NSString *input) {
    __block NSUInteger index = NSNotFound;
    __block NSUInteger count = 0;
    [input enumerateSubstringsInRange:NSMakeRange(0, [input length]) options:(NSStringEnumerationByWords|NSStringEnumerationSubstringNotRequired) usingBlock:^(NSString *substring, NSRange substringRange, NSRange enclosingRange, BOOL *stop) {
        if (++count == 4) {
            // found the 4th word
            index = substringRange.location;
            *stop = YES;
        }
    }];
    if (index == NSNotFound) {
        return @"";
    } else {
        return [input substringFromIndex:index];
    }
}

它的工作方式是我们要求-enumerateSubstrings...用单词进行枚举。当我们找到第 4 个单词时,我们保存它的起始位置并退出循环。现在我们有了第 4 个单词的开头,我们可以从该索引中获取子字符串。如果我们没有得到 4 个单词,我们就返回@""

于 2013-03-12T19:47:47.270 回答
1

最好的答案在这里:How to get the first N words from a NSString in Objective-C?

您只需要更改范围。

于 2013-03-12T19:49:55.377 回答
1

解决方案#1:按照手动方式进行操作:跳过前 n 个空格。

NSString *cutToNthWord(NSString *orig, NSInteger idx)
{
    NSRange r = NSMakeRange(0, 0);
    for (NSInteger i = 0; i < idx; i++) {
        r = [orig rangeOfString:@" "
                        options:kNilOptions
                          range:NSMakeRange(NSMaxRange(r), orig.length - NSMaxRange(r))];
    }
    return [orig substringFromIndex:NSMaxRange(r)];
}

解决方案#2(更干净):在空格处拆分字符串,连接n - k结果数组的最后一个元素,其中k是要跳过的单词数,n是总单词数:

NSString *cutToNthWord(NSString *orig, NSInteger idx)
{
    NSArray *comps = [orig componentsSeparatedByString:@" "];
    NSArray *sub = [comps subarrayWithRange:NSMakeRange(idx, comps.count - idx)];
    return [sub componentsJoinedByString:@" "];
}
于 2013-03-12T19:54:09.320 回答
0

在我的脑海中,并不像凯文巴拉德的解决方案那样光滑:

NSString *phrase = @"I went to the store to buy milk.";

NSMutableString *words = [[NSMutableString alloc] init];
NSArray *words = [phrase componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];

NSMutableIndexSet *indexes = [NSMutableIndexSet indexSetWithIndex:1];
[indexes addIndex:2];
[indexes addIndex:3];
[words removeObjectsAtIndexes:indexes];

NSString *output = [words componentsJoinedByString:@" "];

我的代码不适用于单词之间不使用空格的语言(如普通话和其他一些远东语言)。

于 2013-03-12T19:53:33.553 回答