Respostas:
Use a solução regexp nativa fornecida pelo hfossli.
Use sua biblioteca regexp favorita ou use a seguinte solução nativa do cacau:
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:@" "];
O Regex e o NSCharacterSet estão aqui para ajudá-lo. Essa solução apara os espaços em branco iniciais e finais, bem como vários espaços em branco.
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]];
O registro final
fornece
"Hello this is a long string!"
Possíveis padrões alternativos de regex:
[ ]+
[ \\t]+
\\s+
A facilidade de extensão, desempenho, número de linhas de código e o número de objetos criados tornam essa solução apropriada.
stringByReplacingOccurrencesOfString:
. Não posso acreditar que não sabia disso.
Na verdade, há uma solução muito simples para isso:
NSString *string = @" spaces in front and at the end ";
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"%@", trimmedString)
( Fonte )
Com uma regex, mas sem a necessidade de qualquer estrutura externa:
NSString *theString = @" Hello this is a long string! ";
theString = [theString stringByReplacingOccurrencesOfString:@" +" withString:@" "
options:NSRegularExpressionSearch
range:NSMakeRange(0, theString.length)];
NSRegularExpressionSearch
diz que ele só funciona com o rangeOfString:...
métodos
Uma solução de uma linha:
NSString *whitespaceString = @" String with whitespaces ";
NSString *trimmedString = [whitespaceString
stringByReplacingOccurrencesOfString:@" " withString:@""];
Isso deve servir...
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:@" "];
Outra opção para o regex é o RegexKitLite , que é muito fácil de incorporar em um projeto do iPhone:
[theString stringByReplacingOccurencesOfRegex:@" +" withString:@" "];
Aqui está um trecho de uma NSString
extensão, onde "self"
está a NSString
instância. Ele pode ser usado para recolher espaços em branco contíguos em um único espaço, passando para [NSCharacterSet whitespaceAndNewlineCharacterSet]
e ' '
para os dois argumentos.
- (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;
}
Solução alternativa: obtenha uma cópia do OgreKit (a biblioteca de expressões regulares do Cocoa).
Toda a função é então:
NSString *theStringTrimmed =
[theString stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
OGRegularExpression *regex =
[OGRegularExpression regularExpressionWithString:@"\s+"];
return [regex replaceAllMatchesInString:theStringTrimmed withString:@" "]);
Curto e grosso.
Se você procura a solução mais rápida, uma série de instruções cuidadosamente construída NSScanner
provavelmente funcionaria melhor, mas isso só seria necessário se você planeja processar grandes blocos de texto (muitos megabytes).
de acordo comathieu Godart, é a melhor resposta, mas falta uma linha, todas as respostas reduzem o espaço entre as palavras, mas quando se têm guias ou têm espaço no lugar, é assim: "este é o texto \ t e \ tTab entre, assim por diante "no código de três linhas, vamos: a string que queremos reduzir os espaços em branco
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]];
o resultado é
"this is text , and Tab between , so on"
sem substituir a guia, o resultado será:
"this is text , and Tab between , so on"
Você também pode usar um argumento while simples. Não há mágica RegEx lá, então talvez seja mais fácil entender e alterar no futuro:
while([yourNSStringObject replaceOccurrencesOfString:@" "
withString:@" "
options:0
range:NSMakeRange(0, [yourNSStringObject length])] > 0);
Seguir duas expressões regulares funcionaria dependendo dos requisitos
Em seguida, aplique o método de instância do nsstring stringByReplacingOccurrencesOfString:withString:options:range:
para substituí-los por um único espaço em branco.
por exemplo
[string stringByReplacingOccurrencesOfString:regex withString:@" " options:NSRegularExpressionSearch range:NSMakeRange(0, [string length])];
Nota: Eu não usei a biblioteca 'RegexKitLite' para a funcionalidade acima para iOS 5.xe acima.