Yanıtlar:
Hfossli tarafından sağlanan yerel regexp çözümünü kullanın .
En sevdiğiniz regexp kitaplığınızı kullanın veya aşağıdaki Cocoa yerel çözümü kullanın:
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 ve NSCharacterSet size yardımcı olmak için burada. Bu çözüm, baştaki ve sondaki beyaz boşluğu ve birden çok beyaz boşluğu kırpar.
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]];
Günlük tutma finalverir
"Hello this is a long string!"
Olası alternatif normal ifade kalıpları:
[ ]+[ \\t]+\\s+Genişletme kolaylığı, performans, kod satırı sayısı ve oluşturulan nesne sayısı bu çözümü uygun hale getirir.
stringByReplacingOccurrencesOfString:. Bunu bilmediğime inanamıyorum.
Aslında bunun çok basit bir çözümü var:
NSString *string = @" spaces in front and at the end ";
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"%@", trimmedString)
( Kaynak )
Bir normal ifadeyle, ancak herhangi bir dış çerçeveye ihtiyaç duymadan:
NSString *theString = @" Hello this is a long string! ";
theString = [theString stringByReplacingOccurrencesOfString:@" +" withString:@" "
options:NSRegularExpressionSearch
range:NSMakeRange(0, theString.length)];
NSRegularExpressionSearchyalnızca rangeOfString:...yöntemlerle çalıştığını söylüyor
Tek satırlık bir çözüm:
NSString *whitespaceString = @" String with whitespaces ";
NSString *trimmedString = [whitespaceString
stringByReplacingOccurrencesOfString:@" " withString:@""];
Bunu yapmalı ...
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:@" "];
Regex için başka bir seçenek de, bir iPhone projesine yerleştirilmesi çok kolay olan RegexKitLite'dir :
[theString stringByReplacingOccurencesOfRegex:@" +" withString:@" "];
İşte bir NSStringuzantıdan bir pasaj "self", NSStringörnek nerede . Geçen tek bir boşluğa bitişik boşluk daraltmak için kullanılabilir [NSCharacterSet whitespaceAndNewlineCharacterSet]ve ' 'iki bağımsız için.
- (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;
}
Alternatif çözüm: Kendinize OgreKit'in (Cocoa normal ifade kitaplığı) bir kopyasını alın.
O zaman tüm işlev:
NSString *theStringTrimmed =
[theString stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
OGRegularExpression *regex =
[OGRegularExpression regularExpressionWithString:@"\s+"];
return [regex replaceAllMatchesInString:theStringTrimmed withString:@" "]);
Kısa ve güzel.
En hızlı çözümün peşindeyseniz, dikkatle oluşturulmuş bir dizi talimat kullanılması NSScannermuhtemelen en iyi sonucu verir, ancak bu yalnızca çok büyük (birçok megabayt) metin bloklarını işlemeyi planlıyorsanız gerekli olacaktır.
@Mathieu Godart'a göre en iyi cevap, ancak bir satır eksik, tüm cevaplar kelimeler arasındaki boşluğu azaltır, ancak sekmeler varsa veya boşlukta sekme varsa, şöyle: "bu metin \ t ve \ tTab arasında, bu yüzden "üç satırlı kodda yapacağız: istediğimiz dize beyaz boşlukları azaltacak
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]];
sonuç
"this is text , and Tab between , so on"
sekmeyi değiştirmeden sonuç:
"this is text , and Tab between , so on"
Ayrıca basit bir while argümanı da kullanabilirsiniz. Orada RegEx büyüsü yok, bu nedenle gelecekte anlamak ve değiştirmek daha kolay olabilir:
while([yourNSStringObject replaceOccurrencesOfString:@" "
withString:@" "
options:0
range:NSMakeRange(0, [yourNSStringObject length])] > 0);
İki normal ifadeyi takip etmek, gereksinimlere bağlı olarak çalışacaktır.
Ardından, stringByReplacingOccurrencesOfString:withString:options:range:bunları tek bir beyaz boşlukla değiştirmek için nsstring'in örnek yöntemini uygulayın.
Örneğin
[string stringByReplacingOccurrencesOfString:regex withString:@" " options:NSRegularExpressionSearch range:NSMakeRange(0, [string length])];
Not: iOS 5.x ve üzeri için yukarıdaki işlevsellik için 'RegexKitLite' kitaplığını kullanmadım.