Antworten:
Verwenden Sie die native hgexp-Lösung von hfossli.
Verwenden Sie entweder Ihre bevorzugte reguläre Ausdrucksbibliothek oder die folgende Cocoa-native Lösung:
NSString *theString = @" Hello this is a long string! ";
NSCharacterSet *whitespaces = [NSCharacterSet whitespaceCharacterSet];
NSPredicate *noEmptyStrings = [NSPredicate predicateWithFormat:@"SELF != ''"];
NSArray *parts = [theString componentsSeparatedByCharactersInSet:whitespaces];
NSArray *filteredArray = [parts filteredArrayUsingPredicate:noEmptyStrings];
theString = [filteredArray componentsJoinedByString:@" "];
Regex und NSCharacterSet helfen Ihnen gerne weiter. Diese Lösung schneidet führende und nachfolgende Leerzeichen sowie mehrere Leerzeichen ab.
NSString *original = @" Hello this is a long string! ";
NSString *squashed = [original stringByReplacingOccurrencesOfString:@"[ ]+"
withString:@" "
options:NSRegularExpressionSearch
range:NSMakeRange(0, original.length)];
NSString *final = [squashed stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
Protokollierung final
gibt
"Hello this is a long string!"
Mögliche alternative Regex-Muster:
[ ]+
[ \\t]+
\\s+
Die einfache Erweiterung, Leistung, Anzahl der Codezeilen und die Anzahl der erstellten Objekte machen diese Lösung angemessen.
stringByReplacingOccurrencesOfString:
. Ich kann nicht glauben, dass ich das nicht wusste.
Eigentlich gibt es dafür eine sehr einfache Lösung:
NSString *string = @" spaces in front and at the end ";
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"%@", trimmedString)
( Quelle )
Mit einem regulären Ausdruck, aber ohne externe Rahmenbedingungen:
NSString *theString = @" Hello this is a long string! ";
theString = [theString stringByReplacingOccurrencesOfString:@" +" withString:@" "
options:NSRegularExpressionSearch
range:NSMakeRange(0, theString.length)];
NSRegularExpressionSearch
sagt, dass es nur mit den rangeOfString:...
Methoden
Eine einzeilige Lösung:
NSString *whitespaceString = @" String with whitespaces ";
NSString *trimmedString = [whitespaceString
stringByReplacingOccurrencesOfString:@" " withString:@""];
Das sollte es tun ...
NSString *s = @"this is a string with lots of white space";
NSArray *comps = [s componentsSeparatedByCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
NSMutableArray *words = [NSMutableArray array];
for(NSString *comp in comps) {
if([comp length] > 1)) {
[words addObject:comp];
}
}
NSString *result = [words componentsJoinedByString:@" "];
Eine weitere Option für Regex ist RegexKitLite , das sich sehr einfach in ein iPhone-Projekt einbetten lässt:
[theString stringByReplacingOccurencesOfRegex:@" +" withString:@" "];
Hier ist ein Ausschnitt aus einer NSString
Erweiterung, in der "self"
sich die NSString
Instanz befindet. Es kann verwendet werden zusammenhängende Leerzeichen in ein einzelnes Leerzeichen zu kollabieren , indem in vorbei [NSCharacterSet whitespaceAndNewlineCharacterSet]
und ' '
zu den zwei Argumenten.
- (NSString *) stringCollapsingCharacterSet: (NSCharacterSet *) characterSet toCharacter: (unichar) ch {
int fullLength = [self length];
int length = 0;
unichar *newString = malloc(sizeof(unichar) * (fullLength + 1));
BOOL isInCharset = NO;
for (int i = 0; i < fullLength; i++) {
unichar thisChar = [self characterAtIndex: i];
if ([characterSet characterIsMember: thisChar]) {
isInCharset = YES;
}
else {
if (isInCharset) {
newString[length++] = ch;
}
newString[length++] = thisChar;
isInCharset = NO;
}
}
newString[length] = '\0';
NSString *result = [NSString stringWithCharacters: newString length: length];
free(newString);
return result;
}
Alternative Lösung: Besorgen Sie sich eine Kopie von OgreKit (der Cocoa-Bibliothek für reguläre Ausdrücke).
Die ganze Funktion ist dann:
NSString *theStringTrimmed =
[theString stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
OGRegularExpression *regex =
[OGRegularExpression regularExpressionWithString:@"\s+"];
return [regex replaceAllMatchesInString:theStringTrimmed withString:@" "]);
Kurz und bündig.
Wenn Sie nach der schnellsten Lösung suchen, NSScanner
funktioniert eine sorgfältig erstellte Reihe von Anweisungen wahrscheinlich am besten. Dies ist jedoch nur erforderlich, wenn Sie große Textblöcke (viele Megabyte) verarbeiten möchten.
Laut @Mathieu ist Godart die beste Antwort, aber es fehlt eine Zeile. Alle Antworten reduzieren nur den Abstand zwischen den Wörtern. Wenn jedoch Tabulatoren oder Tabulatoren vorhanden sind, lautet dies wie folgt: "Dies ist Text \ t und \ tTab zwischen, so weiter "In dreizeiligem Code werden wir: Die Zeichenfolge, die wir möchten, reduziert Leerzeichen
NSString * str_aLine = @" this is text \t , and\tTab between , so on ";
// replace tabs to space
str_aLine = [str_aLine stringByReplacingOccurrencesOfString:@"\t" withString:@" "];
// reduce spaces to one space
str_aLine = [str_aLine stringByReplacingOccurrencesOfString:@" +" withString:@" "
options:NSRegularExpressionSearch
range:NSMakeRange(0, str_aLine.length)];
// trim begin and end from white spaces
str_aLine = [str_aLine stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceAndNewlineCharacterSet]];
Das Ergebnis ist
"this is text , and Tab between , so on"
Ohne Tab zu ersetzen, lautet das Ergebnis:
"this is text , and Tab between , so on"
Sie können auch ein einfaches while-Argument verwenden. Es gibt dort keine RegEx-Magie, daher ist es möglicherweise einfacher, sie in Zukunft zu verstehen und zu ändern:
while([yourNSStringObject replaceOccurrencesOfString:@" "
withString:@" "
options:0
range:NSMakeRange(0, [yourNSStringObject length])] > 0);
Das Befolgen von zwei regulären Ausdrücken würde je nach den Anforderungen funktionieren
Wenden Sie dann die Instanzmethode von nsstring an stringByReplacingOccurrencesOfString:withString:options:range:
an, um sie durch einen einzelnen Leerraum zu ersetzen.
z.B
[string stringByReplacingOccurrencesOfString:regex withString:@" " options:NSRegularExpressionSearch range:NSMakeRange(0, [string length])];
Hinweis: Ich habe die 'RegexKitLite'-Bibliothek für die oben genannten Funktionen für iOS 5.x und höher nicht verwendet.