Обріжте проміжки від кінця NSString


Відповіді:


900

Взяте з цієї відповіді тут: https://stackoverflow.com/a/5691567/251012

- (NSString *)stringByTrimmingTrailingCharactersInSet:(NSCharacterSet *)characterSet {
    NSRange rangeOfLastWantedCharacter = [self rangeOfCharacterFromSet:[characterSet invertedSet]
                                                               options:NSBackwardsSearch];
    if (rangeOfLastWantedCharacter.location == NSNotFound) {
        return @"";
    }
    return [self substringToIndex:rangeOfLastWantedCharacter.location+1]; // non-inclusive
}

156
Щоб включити нові рядки в набір символів, використовуйте whitespaceAndNewlineCharacterSet.
penfold

9
Лише невелика примітка: цей метод видаляє пробіли з обох кінців. Це не видаляє пробіли з внутрішньої сторони рядка.
Алекс

10
Я не розумію, як не відповісти на питання отримує так багато відгуків. Ваше рішення також видаляє пробіл на початку рядка, і це не те, що просили.
Джеймс Батчер

4
@JamesBoutcher причиною того, що в ньому набирається стільки результатів, є те, що ми тут шукаємо "обрізку NSString" в Google, і це правильна відповідь на це питання. Це правда, що ОП просила щось інше.
Дан Розенстарк

20

Ще одне рішення включає створення змінних рядків:

//make mutable string
NSMutableString *stringToTrim = [@" i needz trim " mutableCopy];

//pass it by reference to CFStringTrimSpace
CFStringTrimWhiteSpace((__bridge CFMutableStringRef) stringToTrim);

//stringToTrim is now "i needz trim"

13

Ось ви йдете ...

- (NSString *)removeEndSpaceFrom:(NSString *)strtoremove{
    NSUInteger location = 0;
    unichar charBuffer[[strtoremove length]];
    [strtoremove getCharacters:charBuffer];
    int i = 0;
    for(i = [strtoremove length]; i >0; i--) {
        NSCharacterSet* charSet = [NSCharacterSet whitespaceCharacterSet];
        if(![charSet characterIsMember:charBuffer[i - 1]]) {
            break;
        }
    }
    return [strtoremove substringWithRange:NSMakeRange(location, i  - location)];
}

Тож тепер просто зателефонуйте. Припустимо, що у вас є рядок з пробілами спереду та пробілами на кінці, і ви просто хочете видалити пробіли на кінці, ви можете назвати це так:

NSString *oneTwoThree = @"  TestString   ";
NSString *resultString;
resultString = [self removeEndSpaceFrom:oneTwoThree];

resultString тоді в кінці не буде пробілів.


8

Щоб видалити пробіл лише з початку та кінця рядка в Swift:

Швидкий 3

string.trimmingCharacters(in: .whitespacesAndNewlines)

Попередні версії Swift

string.stringByTrimmingCharactersInSet(.whitespaceAndNewlineCharacterSet()))

1
Хіба це не буде обробляти ВСІ пробіли та символи нового рядка? питання задає питання, як обрізати з кінця.
Giorgos Ath

@GiorgosAth Ні, це буде лише обробка символів з початку або в кінці рядка. З документації на яблуко для stringByTrimmigCharactersInSet:- "Повертає новий рядок, зроблений шляхом видалення з обох кінців символів приймача, що містяться в заданому наборі символів." developer.apple.com/reference/foundation/nsstring/…
lostAtSeaJoshua

@GiorgosAth також це той самий точний код, що і прийнята відповідь саме у Swift.
програвAtSeaJoshua

Питання полягало у видаленні з кінця. Ця відповідь видаляється від початку та до кінця. Тому це неправдива відповідь.
Патрік

8
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
                              [NSCharacterSet whitespaceAndNewlineCharacterSet]];
//for remove whitespace and new line character

NSString *trimmedString = [string stringByTrimmingCharactersInSet:
                              [NSCharacterSet punctuationCharacterSet]]; 
//for remove characters in punctuation category

Є багато інших наборів символів. Перевірте це самі відповідно до вашої вимоги.


1
Хіба це не буде обробляти ВСІ пробіли та символи нового рядка? питання задає питання, як обрізати з кінця.
Giorgos Ath

@ giorgos-ath - Так, це видаляє пробіл з кінця
g212gs

Питання полягало у видаленні з кінця. Ця відповідь видаляється від початку та до кінця. Тому це неправдива відповідь.
Патрік

4

Швидка версія

Обрізає лише пробіли в кінці рядка:

private func removingSpacesAtTheEndOfAString(var str: String) -> String {
    var i: Int = countElements(str) - 1, j: Int = i

    while(i >= 0 && str[advance(str.startIndex, i)] == " ") {
        --i
    }

    return str.substringWithRange(Range<String.Index>(start: str.startIndex, end: advance(str.endIndex, -(j - i))))
}

Обрізає пробіли з обох сторін рядка:

var str: String = " Yolo "
var trimmedStr: String = str.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())

1
Питання стосується обрізки пробілів на торці. Ваш код обробляє обидві сторони.
JakubKnejzlik

Цей код не компілюється. Методи countElements () таперед () не визначені.
петрсин

4

Це видалить лише обрані символи, які ви обрали.

func trimRight(theString: String, charSet: NSCharacterSet) -> String {

    var newString = theString

    while String(newString.characters.last).rangeOfCharacterFromSet(charSet) != nil {
        newString = String(newString.characters.dropLast())
    }

    return newString
}

3

У Свіфт

Щоб обрізати простір та новий рядок з обох боків рядка:

var url: String = "\n   http://example.com/xyz.mp4   "
var trimmedUrl: String = url.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceAndNewlineCharacterSet())

3

Просте рішення обрізати лише один кінець замість обох кінців у Objective-C:

@implementation NSString (category)

/// trims the characters at the end
- (NSString *)stringByTrimmingSuffixCharactersInSet:(NSCharacterSet *)characterSet {
    NSUInteger i = self.length;
    while (i > 0 && [characterSet characterIsMember:[self characterAtIndex:i - 1]]) {
        i--;
    }
    return [self substringToIndex:i];
}

@end

І симетрична утиліта для обрізки початку лише:

@implementation NSString (category)

/// trims the characters at the beginning
- (NSString *)stringByTrimmingPrefixCharactersInSet:(NSCharacterSet *)characterSet {
    NSUInteger i = 0;
    while (i < self.length && [characterSet characterIsMember:[self characterAtIndex:i]]) {
        i++;
    }
    return [self substringFromIndex:i];
}

@end

3

Щоб обрізати всі трейлинг символів пробілу (я припускаю , що це на самому справі Ваші наміри), наступне досить чистий і лаконічний спосіб зробити це.

Швидкий 5:

let trimmedString = string.replacingOccurrences(of: "\\s+$", with: "", options: .regularExpression)

Завдання-C:

NSString *trimmedString = [string stringByReplacingOccurrencesOfString:@"\\s+$" withString:@"" options:NSRegularExpressionSearch range:NSMakeRange(0, string.length)];

Один рядок, із штрихом виразки.


1

Тут описано рішення: Як видалити пробіл з правого кінця NSString?

Додайте такі категорії до NSString:

- (NSString *)stringByTrimmingTrailingCharactersInSet:(NSCharacterSet *)characterSet {
    NSRange rangeOfLastWantedCharacter = [self rangeOfCharacterFromSet:[characterSet invertedSet]
                                                               options:NSBackwardsSearch];
    if (rangeOfLastWantedCharacter.location == NSNotFound) {
        return @"";
    }
    return [self substringToIndex:rangeOfLastWantedCharacter.location+1]; // non-inclusive
}

- (NSString *)stringByTrimmingTrailingWhitespaceAndNewlineCharacters {
    return [self stringByTrimmingTrailingCharactersInSet:
            [NSCharacterSet whitespaceAndNewlineCharacterSet]];
}

І ви використовуєте його як таке:

[yourNSString stringByTrimmingTrailingWhitespaceAndNewlineCharacters]

0

Я придумав цю функцію, яка в основному поводиться аналогічно одній у відповіді Олексія:

-(NSString*)trimLastSpace:(NSString*)str{
    int i = str.length - 1;
    for (; i >= 0 && [str characterAtIndex:i] == ' '; i--);
    return [str substringToIndex:i + 1];
}

whitespaceCharacterSetдо того ж пробіл включає також символи табуляції, які в моєму випадку не могли з'явитися. Тож я здогадуюсь, простого порівняння могло бути достатньо.


-1

let string = "Тест обрізаної рядки"

Для видалення пробілу та нового рядка використовуйте нижче код: -

нехай str_trimmed = yourString.trimmingCharacters (в: .whitespacesAndNewlines)

Для видалення лише просторів із рядка використовуйте нижче код: -

нехай str_trimmed = yourString.trimmingCharacters (in: .whitespaces)


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.