次の例を考えてみましょう。
" Hello this is a long string! "
私はそれをに変換したい:
"Hello this is a long string!"
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:@" "];
正規表現と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+
拡張の容易さ、パフォーマンス、コードの行数、および作成されるオブジェクトの数により、このソリューションが適切になります。
実際、それに対する非常に簡単な解決策があります。
NSString *string = @" spaces in front and at the end ";
NSString *trimmedString = [string stringByTrimmingCharactersInSet:
[NSCharacterSet whitespaceAndNewlineCharacterSet]];
NSLog(@"%@", trimmedString)
( ソース )
正規表現を使用しますが、外部フレームワークは必要ありません。
NSString *theString = @" Hello this is a long string! ";
theString = [theString stringByReplacingOccurrencesOfString:@" +" withString:@" "
options:NSRegularExpressionSearch
range:NSMakeRange(0, theString.length)];
1行のソリューション:
NSString *whitespaceString = @" String with whitespaces ";
NSString *trimmedString = [whitespaceString
stringByReplacingOccurrencesOfString:@" " withString:@""];
これでうまくいくはずです...
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:@" "];
Regex KitLite の正規表現の別のオプションは、iPhoneプロジェクトに非常に簡単に組み込むことができます。
[theString stringByReplacingOccurencesOfRegex:@" +" withString:@" "];
これを試して
NSString *theString = @" Hello this is a long string! ";
while ([theString rangeOfString:@" "].location != NSNotFound) {
theString = [theString stringByReplacingOccurrencesOfString:@" " withString:@" "];
}
以下は、"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;
}