2013-05-20 193 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"; 

這是根據什麼從服務器接收到的樣本串。有時弦可能是完美的,有時可能會有更多的空間,然後預期。實質上,我希望在每行的結尾處只有名稱之間只有一個普通的空格,而只有一個\ n。我如何刪除多餘的空白區域(多於一個常規空間)以及多於一個新的空白區域?

我試着做

stringReplaceOccurencesOfString 

但是,這並不涵蓋所有情況。

任何人都可以幫助我嗎?謝謝

+0

你試過了嗎?簡單地一次讀取1個字符並將其置於一個新的可變字符串中,如果當前字符是空格或換行符的副本,則只掃描當前字符? – Pochi

+0

@rdelmar謝謝,但如指出的那樣不客觀c – 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: