Risposte:
Usa la soluzione regexp nativa fornita da hfossli.
Utilizza la tua libreria regexp preferita o utilizza la seguente soluzione nativa di Cocoa:
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 e NSCharacterSet sono qui per aiutarti. Questa soluzione taglia gli spazi bianchi iniziali e finali, nonché più spazi bianchi.
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]];
La registrazione finaldà
"Hello this is a long string!"
Possibili pattern regex alternativi:
[ ]+[ \\t]+\\s+La facilità di estensione, le prestazioni, il numero di righe di codice e il numero di oggetti creati rendono questa soluzione appropriata.
stringByReplacingOccurrencesOfString:. Non posso credere di non saperlo.
In realtà, c'è una soluzione molto semplice a questo:
NSString *string = @" spaces in front and at the end ";
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"%@", trimmedString)
( Fonte )
Con una regex, ma senza la necessità di alcun framework esterno:
NSString *theString = @" Hello this is a long string! ";
theString = [theString stringByReplacingOccurrencesOfString:@" +" withString:@" "
options:NSRegularExpressionSearch
range:NSMakeRange(0, theString.length)];
NSRegularExpressionSearchdice che funziona solo con i rangeOfString:...metodi
Una soluzione a una riga:
NSString *whitespaceString = @" String with whitespaces ";
NSString *trimmedString = [whitespaceString
stringByReplacingOccurrencesOfString:@" " withString:@""];
Questo dovrebbe farlo ...
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:@" "];
Un'altra opzione per regex è RegexKitLite , che è molto facile da incorporare in un progetto iPhone:
[theString stringByReplacingOccurencesOfRegex:@" +" withString:@" "];
Ecco uno snippet da NSStringun'estensione, dove si "self"trova l' NSStringistanza. Può essere usato per comprimere gli spazi bianchi contigui in un unico spazio passando [NSCharacterSet whitespaceAndNewlineCharacterSet]e ' 'ai due argomenti.
- (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;
}
Soluzione alternativa: procurati una copia di OgreKit (la libreria di espressioni regolari Cocoa).
L'intera funzione è quindi:
NSString *theStringTrimmed =
[theString stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
OGRegularExpression *regex =
[OGRegularExpression regularExpressionWithString:@"\s+"];
return [regex replaceAllMatchesInString:theStringTrimmed withString:@" "]);
Breve e dolce.
Se stai cercando la soluzione più veloce, una serie di istruzioni attentamente costruita NSScannerpotrebbe funzionare meglio, ma sarebbe necessario solo se prevedi di elaborare enormi blocchi di testo (molti megabyte).
secondo @Mathieu Godart è la risposta migliore, ma manca qualche riga, tutte le risposte riducono semplicemente lo spazio tra le parole, ma quando se hanno tabulazioni o hanno tab nel posto spazio, come questo: "questo è testo \ t, e \ tTab tra, così via "in tre righe di codice faremo: la stringa che vogliamo ridurre gli spazi bianchi
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]];
il risultato è
"this is text , and Tab between , so on"
senza sostituire tab il risultato sarà:
"this is text , and Tab between , so on"
Puoi anche usare un semplice argomento while. Non c'è nessuna magia RegEx lì dentro, quindi forse è più facile da capire e modificare in futuro:
while([yourNSStringObject replaceOccurrencesOfString:@" "
withString:@" "
options:0
range:NSMakeRange(0, [yourNSStringObject length])] > 0);
Le seguenti due espressioni regolari funzionerebbero a seconda dei requisiti
Quindi applica il metodo di istanza di nsstring stringByReplacingOccurrencesOfString:withString:options:range:per sostituirli con un singolo spazio bianco.
per esempio
[string stringByReplacingOccurrencesOfString:regex withString:@" " options:NSRegularExpressionSearch range:NSMakeRange(0, [string length])];
Nota: non ho utilizzato la libreria "RegexKitLite" per le funzionalità di cui sopra per iOS 5.xe versioni successive.