NSScanner在简单的空格移除上表现奇怪

11
我想替换文本中所有的多个空格为单个空格。这应该是一个非常简单的任务,但出于某些原因,它返回的结果与预期不同。我已经阅读了NSScanner的文档,似乎它无法正常工作!
NSScanner *scanner = [[NSScanner alloc] initWithString:@"This    is   a test of NSScanner   !"];
NSMutableString *result = [[NSMutableString alloc] init];
NSString *temp;
NSCharacterSet *whitespace = [NSCharacterSet whitespaceCharacterSet];
while (![scanner isAtEnd]) {

    // Scan upto and stop before any whitespace
    [scanner scanUpToCharactersFromSet:whitespace intoString:&temp];

    // Add all non whotespace characters to string
    [result appendString:temp];

    // Scan past all whitespace and replace with a single space
    if ([scanner scanCharactersFromSet:whitespace intoString:NULL]) {
        [result appendString:@" "];
    }

}

但不知何故,结果是@"ThisisatestofNSScanner!"而不是@"This is a test of NSScanner !"

如果你阅读了评论,并理解每一行代码的作用,这似乎很简单!scanUpToCharactersFromSet应该在遇到空格时停止扫描。scanCharactersFromSet然后应该将扫描器移动到非空格字符之前的空格字符。然后循环继续到结尾。

我缺少什么或者没有理解到什么?

1个回答

23

啊,我搞清楚了!原来 NSScanner 默认会跳过空格!

事实证明,你只需要将 charactersToBeSkipped 设置为 nil

[scanner setCharactersToBeSkipped:nil];

1
文档并不保证 nil 在那里能够正常工作;使用一个空的 NSCharacterSet 对象会更安全。创建一个空对象的一种方法是 [NSCharacterSet characterSetWithRange:(NSRange){ ' ', 0 }] - Peter Hosey
2
根据文档,看起来nil现在是可以使用的。 skipSet - 用于在扫描值表示时忽略的字符集。传递nil以不忽略任何字符。 - christophercotton
哦,谢谢!我花了大约两个小时不停地敲键盘,想知道为什么它忽略了我的空格。 - aryaxt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接