Ajuster les espaces à la fin d'une chaîne NSS

Réponses:

900

Tiré de cette réponse ici: 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
}
Dan
la source
156
Pour inclure des retours à la ligne dans le jeu de caractères, utilisez whitespaceAndNewlineCharacterSet.
Penfold
9
Juste une petite note: cette méthode supprime les espaces blancs des deux extrémités. Il ne supprime pas les espaces blancs de l'intérieur de la chaîne.
Alex
10
Je ne comprends pas comment le fait de ne pas répondre à la question suscite autant de votes positifs. Votre solution supprime également les espaces au début de la chaîne, et ce n'est pas ce qui a été demandé.
James Boutcher
4
@JamesBoutcher, la raison pour laquelle il obtient autant de votes positifs est que nous sommes arrivés ici à la recherche de "trim NSString" dans Google et c'est la bonne réponse à cette question. C'est vrai que le PO a demandé autre chose.
Dan Rosenstark
20

Une autre solution consiste à créer une chaîne mutable:

//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"
Matt H.
la source
13

Voici...

- (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)];
}

Alors maintenant, appelez-le. Supposons que vous ayez une chaîne avec des espaces à l'avant et des espaces à la fin et que vous vouliez simplement supprimer les espaces à la fin, vous pouvez l'appeler comme ceci:

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

resultString n'aura alors aucun espace à la fin.

Alex
la source
8

Pour supprimer des espaces uniquement au début et à la fin d'une chaîne dans Swift:

Swift 3

string.trimmingCharacters(in: .whitespacesAndNewlines)

Versions Swift précédentes

string.stringByTrimmingCharactersInSet(.whitespaceAndNewlineCharacterSet()))
lostAtSeaJoshua
la source
1
Cela ne va-t-il pas couper TOUS les espaces et les caractères de nouvelle ligne? la question demande comment couper à partir de la fin.
Giorgos Ath
@GiorgosAth Non, cela ne fera que couper les caractères du début ou de la fin de la chaîne. De la documentation d'Apple pour stringByTrimmigCharactersInSet:- "Renvoie une nouvelle chaîne créée en supprimant des deux extrémités du récepteur les caractères contenus dans un jeu de caractères donné." developer.apple.com/reference/foundation/nsstring/…
lostAtSeaJoshua
@GiorgosAth c'est aussi le même code exact que la réponse acceptée juste dans Swift.
lostAtSeaJoshua
La question était de retirer de la fin. Cette réponse supprime du début et de la fin. Ce n'est donc pas une réponse valable.
Patrick
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

Il existe de nombreux autres jeux de caractères. Vérifiez-le vous-même selon vos besoins.

g212gs
la source
1
Cela ne va-t-il pas couper TOUS les espaces et les caractères de nouvelle ligne? la question demande comment couper à partir de la fin.
Giorgos Ath
@ giorgos-ath - Oui, il supprime l'espace blanc de la fin
g212gs
La question était de retirer de la fin. Cette réponse supprime du début et de la fin. Ce n'est donc pas une réponse valable.
Patrick
4

Version Swift

Ajuste uniquement les espaces à la fin de la chaîne:

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))))
}

Découpe les espaces des deux côtés de la chaîne:

var str: String = " Yolo "
var trimmedStr: String = str.stringByTrimmingCharactersInSet(NSCharacterSet.whitespaceCharacterSet())
Roi-sorcier
la source
1
La question porte sur le découpage final des espaces. Votre code coupe les deux côtés.
JakubKnejzlik
Ce code ne se compile pas. Les méthodes countElements () et advance () ne sont pas définies.
petrsyn
4

Cela supprimera uniquement les caractères de fin de votre choix.

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
}
Teo Sartori
la source
3

Dans Swift

Pour couper l'espace et la nouvelle ligne des deux côtés de la chaîne:

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

Une solution simple pour couper seulement une extrémité au lieu des deux extrémités dans 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

Et un utilitaire symétrique pour couper le début uniquement:

@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
Cœur
la source
3

Pour couper tous les caractères d'espacement fin (je suppose que c'est en fait votre intention), ce qui suit est une façon assez propre et concise de le faire.

Swift 5:

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

Objectif c:

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

Une ligne, avec un trait de regex.

PixelCloudSt
la source
1

La solution est décrite ici: Comment supprimer les espaces blancs de l'extrémité droite de NSString?

Ajoutez les catégories suivantes à 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]];
}

Et vous l'utilisez comme tel:

[yourNSString stringByTrimmingTrailingWhitespaceAndNewlineCharacters]
Snouto
la source
0

J'ai créé cette fonction, qui se comporte essentiellement de la même manière que dans la réponse d'Alex:

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

whitespaceCharacterSetoutre l'espace lui-même comprend également un caractère de tabulation, qui dans mon cas ne pouvait pas apparaître. Donc je suppose qu'une simple comparaison pourrait suffire.

pckill
la source
-1

let string = "Test Trimmed String"

Pour supprimer les espaces blancs et les nouvelles lignes, utilisez le code ci-dessous: -

laissez str_trimmed = yourString.trimmingCharacters (dans: .whitespacesAndNewlines)

Pour supprimer uniquement les espaces de la chaîne, utilisez le code ci-dessous: -

laissez str_trimmed = yourString.trimmingCharacters (dans: .whitespaces)

kangna sharma
la source
-7
NSString* NSStringWithoutSpace(NSString* string)
{
    return [string stringByReplacingOccurrencesOfString:@" " withString:@""];
}
Ashish Patel
la source