2013-05-20 2 views
1

공백을 초과하거나 초과하지 않을 수있는 필터링되지 않은 문자열이 있습니다. 예를 들어 우리는 다음과 같은 문자열을 가지고 있습니다 :초과 공백 제거

NSString *testData= @"Jim Bob Marcus Trent Mark\n\n 
        Megan Laurie Andrea Katherine\n 
        Dylan    Liam  Bernard\n 
                  \n 
        Tim Thomas Britney Marcus"; 

이것은 서버로부터받은 문자열에 따른 샘플 문자열입니다. 때로는 문자열이 완벽 할 수 있으며 때때로 예상보다 많은 공백이있을 수 있습니다. 본질적으로 이름 사이에 공백 만 있으면되고 각 행의 끝에는 하나만 있으면됩니다. 초과 공백 (일반 공백보다 큼)을 제거하고 새 행을 하나 이상 제거하려면 어떻게합니까?

나는
stringReplaceOccurencesOfString 

일을 시도하지만 그 모든 경우에 적용되지 않습니다.

아무도 도와 줄 수 있습니까? 감사합니다.

+0

시도해 보았습니까? 단순히 한 번에 1 개의 문자를 읽고 그것을 새로운 가변 문자열에 넣고, 공간 또는 줄 바꿈이 중복되면 현재의 문자를 건너 뛰는 것입니까? – Pochi

+0

@rdelmar 감사하지만 지적한 바와 같이 객관적인 것은 아닙니다. – Teddy13

+0

@ ModernCarpentry가 동의했습니다! – Teddy13

답변

3

이 작업을 수행하는 공상 많은 방법이 있습니다, 하지만이 방법 중 가장 읽기 쉽고 이해하기 쉬운 방법 중 하나입니다. (매우 쉬울뿐만 아니라) 매우 편리합니다.

NSString *testData= @"Jim Bob Marcus Trent Mark\n\n" 
"Megan Laurie Andrea Katherine\n" 
"Dylan    Liam  Bernard\n" 
"\n" 
"Tim Thomas Britney Marcus"; 

// Remove duplicate spaces 
while ([testData rangeOfString:@" "].location != NSNotFound) 
    testData = [testData stringByReplacingOccurrencesOfString:@" " withString:@" "]; 

// Remove duplicate newlines 
while ([testData rangeOfString:@"\n\n"].location != NSNotFound) 
    testData = [testData stringByReplacingOccurrencesOfString:@"\n\n" withString:@"\n"]; 

NSLog(@"\n%@", testData); 

// Results: 
// Jim Bob Marcus Trent Mark 
// Megan Laurie Andrea Katherine 
// Dylan Liam Bernard 
// Tim Thomas Britney Marcus 

이 대답은 https://stackoverflow.com/a/9715463/937822입니다.
이 솔루션이 마음에 드시면 그의 답변에 투표하십시오. :)

더 효율적인 방법이 있습니다. 많은 양의 데이터를 처리하고 성능이 충분하지 않은 경우 개별 문자를 반복하여 하위 수준 C 기술을 사용하여 수동으로 문자열을 처리하는 것이 가장 쉽습니다.

NSString *testData= @"Jim Bob Marcus Trent Mark\n\n" 
"Megan Laurie Andrea Katherine\n" 
"Dylan    Liam  Bernard\n" 
"\n" 
"Tim Thomas Britney Marcus"; 

// Create our C character arrays 
const char *sourceString = [testData UTF8String]; 
int len = strlen(sourceString); 
char *destString = malloc(len * sizeof(char)); 

// Remove the duplicate spaces and newlines by not copying them into the destination character array. 
char prevChar = 0; 
int y = 0; 
for (int i = 0; i < len; i++) 
{ 
    if (sourceString[i] == ' ' && prevChar == ' ') 
     continue; 
    if (sourceString[i] == '\n' && prevChar == '\n') 
     continue; 

    destString[y++] = sourceString[i]; 
    prevChar = sourceString[i]; 
} 
destString[y] = '\0'; 

// Create the new NSString object 
NSString *trimmedString = [NSString stringWithUTF8String:destString]; 

// Free our memory 
free(destString); 

NSLog(@"\n%@", trimmedString); 

// Results: 
// Jim Bob Marcus Trent Mark 
// Megan Laurie Andrea Katherine 
// Dylan Liam Bernard 
// Tim Thomas Britney Marcus 
0

NSRegularExpression 또는 NSScanner를 살펴보십시오. 이 또한있는 NSString가

교체 하위 문자열 사용할 수있는 다음과 같은 방법이있다 - stringByReplacingOccurrencesOfString : withString : - stringByReplacingOccurrencesOfString : withString : 옵션 : 범위 : - stringByReplacingCharactersInRange : withString :