将白色空间的序列折叠成单个字符和修剪字符串

122 objective-c nsstring ios

请考虑以下示例:

"    Hello      this  is a   long       string!   "
Run Code Online (Sandbox Code Playgroud)

我想将其转换为:

"Hello this is a long string!"
Run Code Online (Sandbox Code Playgroud)

Geo*_*lly 124

OS X 10.7+和iOS 3.2+

使用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:@" "];
Run Code Online (Sandbox Code Playgroud)

  • 我很好奇将性能与正则表达式的替换进行比较,并使用修剪来移除末端.一方面,你有一个正则表达式来处理.另一方面,你有一个谓词.要么需要对各个表达式进行内部处理. (4认同)
  • 很好的回答,赞成这样,但我挑战你对"简单"的定义.真诚的,前Python家伙现在在ObjC-land ;-) (2认同)
  • 你让我笑了起来,"如果有一个简单的解决方案,请不要使用复杂的解决方案".所以最容易的是[toBeTrimmed stringByReplacingOccurrencesOfString:@""withString:@""]没有?我仍然赞同你的答案,但这绝对是最简单的 (2认同)
  • @MárioCarvalho问题是如何删除*多余*空格,而不是全部. (2认同)

hfo*_*sli 52

正则表达式和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]];
Run Code Online (Sandbox Code Playgroud)

记录final给出

"Hello this is a long string!"
Run Code Online (Sandbox Code Playgroud)

可能的替代正则表达式模式:

  • 仅替换空间: [ ]+
  • 替换空格和标签: [ \\t]+
  • 替换空格,制表符和换行符: \\s+

性能破坏

易于扩展,性能,代码行数和创建的对象数使该解决方案合适.

  • hfossli是我书中最优雅的答案.另外我刚学会了你可以在`stringByReplacingOccurrencesOfString:`中使用正则表达式.不敢相信我不知道. (3认同)

ari*_*kfr 41

实际上,有一个非常简单的解决方案:

NSString *string = @" spaces in front and at the end ";
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
                                  [NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"%@", trimmedString)
Run Code Online (Sandbox Code Playgroud)

(来源)

  • 你们为什么投票支持和答案而不提供问题的解决方案?stringByTrimmingCharactersInSet不会分析字符串的iside,只会分析边缘.Georg Sholly的回答是完美的. (32认同)
  • 我认为这将只消除前导和尾随空格,并消除所有这些空格.它不会处理"你好foo" (29认同)
  • 这不是问题的答案,但它肯定对我有帮助.谢谢 (3认同)
  • d*mn行结尾和自动格式...它不处理"hello______foo"(假设_ - >""因为格式化注释很难) (2认同)

Mon*_*art 13

使用正则表达式,但不需要任何外部框架:

NSString *theString = @"    Hello      this  is a   long       string!   ";

theString = [theString stringByReplacingOccurrencesOfString:@" +" withString:@" "
                       options:NSRegularExpressionSearch
                       range:NSMakeRange(0, theString.length)];
Run Code Online (Sandbox Code Playgroud)

  • `NSRegularExpressionSearch`的文档说它只适用于`rangeOfString:...`方法 (2认同)

小智 9

一线解决方案:

NSString *whitespaceString = @" String with whitespaces ";

NSString *trimmedString = [whitespaceString
        stringByReplacingOccurrencesOfString:@" " withString:@""];
Run Code Online (Sandbox Code Playgroud)

  • 虽然这很有用,但它会删除所有空格.OP基本上需要空白压缩,例如修剪,然后将连续的空白减少到单个空白. (5认同)
  • 帮帮我:) 感谢那! (2认同)
  • 这不会回答OP,而是删除字符串中的所有空格,因此最终得到@"Stringwithwhitespaces" (2认同)

Bar*_*ark 6

这应该做到......

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:@" "];
Run Code Online (Sandbox Code Playgroud)


dme*_*edi 3

这是扩展程序的片段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;
}
Run Code Online (Sandbox Code Playgroud)