답변:
hfossli에서 제공 하는 기본 regexp 솔루션을 사용하십시오 .
좋아하는 regexp 라이브러리를 사용하거나 다음 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와 NSCharacterSet이 도움을드립니다. 이 솔루션은 선행 및 후행 공백과 여러 공백을 제거합니다.
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]];
로깅 final
은
"Hello this is a long string!"
가능한 대체 정규식 패턴 :
[ ]+
[ \\t]+
\\s+
손쉬운 확장, 성능, 코드 라인 수 및 생성 된 개체 수가이 솔루션에 적합합니다.
stringByReplacingOccurrencesOfString:
. 내가 그것을 몰랐다는 것을 믿을 수 없습니다.
사실, 그것에 대한 매우 간단한 해결책이 있습니다.
NSString *string = @" spaces in front and at the end ";
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"%@", trimmedString)
( 출처 )
정규식을 사용하지만 외부 프레임 워크가 필요하지 않습니다.
NSString *theString = @" Hello this is a long string! ";
theString = [theString stringByReplacingOccurrencesOfString:@" +" withString:@" "
options:NSRegularExpressionSearch
range:NSMakeRange(0, theString.length)];
NSRegularExpressionSearch
는 rangeOfString:...
메서드 에서만 작동한다고 말합니다
한 줄 솔루션 :
NSString *whitespaceString = @" String with whitespaces ";
NSString *trimmedString = [whitespaceString
stringByReplacingOccurrencesOfString:@" " withString:@""];
그래야만 ...
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에 대한 또 다른 옵션은 RegexKitLite 이며 iPhone 프로젝트에 포함하기가 매우 쉽습니다.
[theString stringByReplacingOccurencesOfRegex:@" +" withString:@" "];
다음 은 인스턴스 가 있는 NSString
확장 의 스 니펫입니다 . 전달하여 하나의 공간으로 연속 된 공백을 축소하는 데 사용할 수 있습니다 및 두 개의 인수에."self"
NSString
[NSCharacterSet whitespaceAndNewlineCharacterSet]
' '
- (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;
}
대안 : OgreKit (Cocoa 정규 표현식 라이브러리) 사본을 얻으십시오.
전체 기능은 다음과 같습니다.
NSString *theStringTrimmed =
[theString stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
OGRegularExpression *regex =
[OGRegularExpression regularExpressionWithString:@"\s+"];
return [regex replaceAllMatchesInString:theStringTrimmed withString:@" "]);
짧고 달다.
가장 빠른 솔루션을 추구하는 경우 신중하게 구성된 일련의 지침을 사용하는 NSScanner
것이 가장 잘 작동 할 수 있지만 방대한 (수 메가 바이트) 텍스트 블록을 처리하려는 경우에만 필요합니다.
@Mathieu Godart에 따르면 최선의 답변이지만 일부 줄이 누락되어 모든 답변은 단어 사이의 공백을 줄입니다. 그러나 탭이 있거나 탭이있는 경우 다음과 같이 표시됩니다. "이것은 텍스트 \ t이고 \ tTab 사이에, 그래서 "3 줄 코드에서 우리는 공백을 줄이려는 문자열
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]];
결과는
"this is text , and Tab between , so on"
탭을 교체하지 않으면 결과는 다음과 같습니다.
"this is text , and Tab between , so on"
간단한 while 인수를 사용할 수도 있습니다. 거기에는 RegEx 마법이 없으므로 향후 이해하고 변경하는 것이 더 쉬울 수 있습니다.
while([yourNSStringObject replaceOccurrencesOfString:@" "
withString:@" "
options:0
range:NSMakeRange(0, [yourNSStringObject length])] > 0);
다음 두 가지 정규식은 요구 사항에 따라 작동합니다.
그런 다음 nsstring의 인스턴스 메소드를 적용하십시오. stringByReplacingOccurrencesOfString:withString:options:range:
를 하여 단일 공백으로 .
예 :
[string stringByReplacingOccurrencesOfString:regex withString:@" " options:NSRegularExpressionSearch range:NSMakeRange(0, [string length])];
참고 : iOS 5.x 이상에서 위의 기능에 'RegexKitLite'라이브러리를 사용하지 않았습니다.