web-dev-qa-db-ja.com

空白のシーケンスを1文字にまとめて文字列をトリムする

次の例を考えてみましょう。

"    Hello      this  is a   long       string!   "

私はそれをに変換したい:

"Hello this is a long string!"
122
Paul

OS X 10.7+およびiOS 3.2+

Hfossliが提供するネイティブの regexp solution を使用します。

そうでなければ

お気に入りの正規表現ライブラリを使用するか、次の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:@" "];
124
Georg Schölly

正規表現と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+

パフォーマンスランダウン

拡張の容易さ、パフォーマンス、コードの行数、および作成されるオブジェクトの数により、このソリューションが適切になります。

52
hfossli

実際、それに対する非常に簡単な解決策があります。

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

ソース

40
arikfr

正規表現を使用しますが、外部フレームワークは必要ありません。

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

theString = [theString stringByReplacingOccurrencesOfString:@" +" withString:@" "
                       options:NSRegularExpressionSearch
                       range:NSMakeRange(0, theString.length)];
13
MonsieurDart

1行のソリューション:

NSString *whitespaceString = @" String with whitespaces ";

NSString *trimmedString = [whitespaceString
        stringByReplacingOccurrencesOfString:@" " withString:@""];
9
TwoBeerGuy

これでうまくいくはずです...

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:@" "];
6
Barry Wark

Regex KitLite の正規表現の別のオプションは、iPhoneプロジェクトに非常に簡単に組み込むことができます。

[theString stringByReplacingOccurencesOfRegex:@" +" withString:@" "];
4
Daniel Dickison

これを試して

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

while ([theString rangeOfString:@"  "].location != NSNotFound) {
    theString = [theString stringByReplacingOccurrencesOfString:@"  " withString:@" "];
}
3
sinh99

以下は、"self"NSStringインスタンスであるNSString拡張からの抜粋です。 [NSCharacterSet whitespaceAndNewlineCharacterSet]' 'を2つの引数に渡すことにより、連続した空白を単一のスペースに折りたたむことができます。

- (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;
}
3
dmercredi