【问题标题】:Remove newline character from first line of NSString从 NSString 的第一行删除换行符
【发布时间】:2010-11-03 13:35:41
【问题描述】:

如何从 NSString 中删除第一个 \n 字符?

编辑:澄清一下,我想做的是: 如果字符串的第一行包含 \n 字符,则删除它,否则什么也不做。

ie:如果字符串是这样的:

@"\nhello, this is the first line\nthis is the second line"

并且反对在第一行不包含换行符的字符串:

@"hello, this is the first line\nthis is the second line."

我希望它更清楚。

【问题讨论】:

  • 您的编辑实际上使问题不太清楚。从概念上讲,“字符串的第一行”(如果有的话)对我来说意味着直到(可能包括)字符串中第一个换行符的所有字符。如果你的意思不是“第一行”,你可能需要再次澄清。
  • 奎因说的。根据定义,第一行必须包含换行符。否则字符串只有一行。

标签: iphone objective-c cocoa macos nsstring


【解决方案1】:

除了创建一个 NSMutableString 并使用一些保留/释放调用之外,您可以只使用原始字符串并通过使用以下代码来简化代码:(需要 10.5+)

NSRange foundRange = [original rangeOfString:@"\n"];
if (foundRange.location != NSNotFound)
    [original stringByReplacingOccurrencesOfString:@"\n"
                                        withString:@""
                                           options:0 
                                             range:foundRange];

(详情请参阅-stringByReplacingOccurrencesOfString:withString:options:range:。)

最后一次调用方法调用的结果甚至可以安全地分配回原来的IF你先自动释放那里的东西,这样你就不会泄漏内存。

【讨论】:

  • +1 这比我的解决方案要好得多。该特定方法仅在 10.5 及更高版本中可用,但现在应该是大多数系统,10.6 即将推出。
  • 这种方法在 10.5+ 上表现出色,我忘记了。我很幸运,不必再担心老虎的支持了。 :-)
【解决方案2】:
[string stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]]

如果你想要的话,将从任何类型的换行符中修剪你的字符串。

[string stringByReplacingOccurrencesOfString:@"\n" withString:@"" options:0 range:NSMakeRange(0, 1)]

如果换行符是字符串中的第一个字符,将完全按照您的要求进行操作并删除换行符

【讨论】:

  • options:nil 应该是 options:0
  • nil == NULL == 0 在 C++ 中。 nil == NULL == (void *)0 在 C 中。NSStringCompareOptions 是 typedef NSUInteger,在 32 位平台上是 32 位,在 64 位平台上是 64 位。整数文字代替命名常量违背了我的感受;)
  • @monowerker:这不是 C++。我意识到 nil 被简单地定义为零。 Xcode 编译器出于某种原因在 3.0 中给你一个警告,使用 0 修复了这个问题。很奇怪,但这就是发生的事情。
  • 你说得对,我会将其转换为 (NSStringCompareOptions)nil 以便快速查找掩码并删除警告。但 0 永远不会出错。
  • [string stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]] 是对的.. 谢谢
【解决方案3】:

这应该可以解决问题:

NSString * ReplaceFirstNewLine(NSString * original)
{
    NSMutableString * newString = [NSMutableString stringWithString:original];

    NSRange foundRange = [original rangeOfString:@"\n"];
    if (foundRange.location != NSNotFound)
    {
        [newString replaceCharactersInRange:foundRange
                                 withString:@""];
    }

    return [[newString retain] autorelease];
}

【讨论】:

  • 这有(1)返回可变字符串或(2)需要不可变副本以避免这种情况的缺点。使用 -stringByReplacingOccurrencesOfString:withString:options:range: 更有效地执行此操作。我的回答包括详细信息和代码示例。
猜你喜欢
  • 1970-01-01
  • 2020-01-10
  • 1970-01-01
  • 1970-01-01
  • 2012-12-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-09
相关资源
最近更新 更多