2013-05-20 60 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: