Удалить символ новой строки из первой строки NSString

Как я могу удалить первый\n символ из строки NSString?

Изменить: просто чтобы уточнить, что я хотел бы сделать, это: Если первая строка строки содержит символ \ n, удалите его, иначе ничего не делайте.

то есть: если строка такая:

<code>@"\nhello, this is the first line\nthis is the second line"
</code>

и в отличие от строки, которая не содержит символ новой строки в первой строке:

<code>@"hello, this is the first line\nthis is the second line."
</code>

Я надеюсь, что это делает это более ясным.

 Chuck18 июн. 2009 г., 01:04
Что сказал Куинн По определению, первая строка должна содержать новую строку. В противном случае строка имеет только одну строку.
 Quinn Taylor18 июн. 2009 г., 00:54
Ваше редактирование фактически делает вопрос менее ясным. Концептуально, «первая строка строки», если что-нибудь, будет означать для меня все символы до (и, возможно, включая) первую новую строку в строке. Если вы имеете в виду что-то иное, чем "первая строка", возможно, вам придется уточнить еще раз.

Ответы на вопрос(3)

Вместо того, чтобы создавать NSMutableString и использовать несколько вызовов retain / release, вы можете использовать только исходную строку и упростить код, используя вместо этого следующее: (требуется 10,5+)

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

(Увидеть-stringByReplacingOccurrencesOfString:withString:options:range: для деталей.)

Результат последнего вызова метода вызова может быть безопасно возвращен к исходномуIF сначала вы автоматически высвобождаете то, что там происходит, так что вы не теряете память.

 28 июн. 2009 г., 00:03
+1 Это намного лучше моего решения. Этот конкретный метод доступен только в версии 10.5 и выше, но сейчас это должно быть в большинстве систем, что в ближайшее время выйдет с 10.6.
 30 июн. 2009 г., 19:14
Отличный улов на 10,5+ для этого метода, я забыл об этом. Мне повезло, что мне больше не нужно беспокоиться о поддержке Тигра. :-)
[string stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]]

обрежет вашу строку с любого вида новых строк, если это то, что вы хотите.

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

выполнит в точности то, что вы просите, и удалит символ новой строки, если это первый символ в строке

 Brock Woolf17 июн. 2009 г., 22:11
@monowerker: это не C ++. Я понимаю, что ноль просто определяется как ноль. Компилятор Xcode по какой-то причине в 3.0 выдает предупреждение, используя 0, исправляет это. Странно, но это то, что происходит.
 23 мар. 2011 г., 06:49
[string stringByTrimmingCharactersInSet: [NSCharacterSet newlineCharacterSet]] правильно .. Спасибо
 17 июн. 2009 г., 14:08
ноль == NULL == 0 в C ++. nil == NULL == (void *) 0 в C. NSStringCompareOptions - это typedef NSUInteger, который является 32-разрядным на 32-разрядных платформах и 64-разрядным на 64-разрядных платформах. Целочисленные литералы вместо именованных констант идут вразрез с моими чувствами;)
 17 июн. 2009 г., 23:32
Вы правы, я бы преобразовал его в (NSStringCompareOptions) nil для быстрого поиска масок и удаления предупреждения. Но 0 никогда не будет неправильным.
 Brock Woolf17 июн. 2009 г., 10:24
опции: ноль должно быть опции: 0
Решение Вопроса

Это должно сделать трюк:

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];
}
 27 июн. 2009 г., 21:58
Это имеет обратную сторону: (1) возвращать изменяемую строку или (2) требовать неизменяемой копии, чтобы избежать этого. Используйте -stringByReplacingOccursionsOfString: withString: options: range:, чтобы сделать это более эффективно. Мой ответ включает в себя детали и пример кода.

Ваш ответ на вопрос