テキストの場合bozo__foo!!bar.baz
、これを含むNSStringを分割する方法は(bozo, foo, bar, baz)
になりますか?複数の区切り文字を含む分割NSString?
つまり、文字列(デリミタ)付きのコンポーネントでは、__
,!!
および.
としてください。
テキストの場合bozo__foo!!bar.baz
、これを含むNSStringを分割する方法は(bozo, foo, bar, baz)
になりますか?複数の区切り文字を含む分割NSString?
つまり、文字列(デリミタ)付きのコンポーネントでは、__
,!!
および.
としてください。
NSCharacterSetを使用して文字列を分割できます。私はこの質問が既に回答されていることを承知しているが、これは、複数の文字列を使用して文字列を分離する方法である。この
NSString *[email protected]"bozo__foo!!bar.baz";
NSString *sep = @"_!.";
NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:sep];
NSArray *temp=[test componentsSeparatedByCharactersInSet:set];
NSLog(@"temp=%@",temp);
NSString *text = @"bozo__foo!!bar.baz";
NSArray *split1 = [text componentsSeparatedByString:@"__"];
NSArray *split2 = [[split1 lastObject] componentsSeparatedByString:@"!!"];
NSArray *split3 = [[split2 lastObject] componentsSeparatedByString:@"."];
NSLog(@"%@, %@, %@, %@", split1[0], split2[0], split3[0], split3[1]);
。 – Matoe
を試してみてください。これはカテゴリ〜NSStringです。
- (NSArray<NSString *> *)componentsSeparatedByStrings:(NSArray<NSString *> *)separators
{
NSMutableArray<NSString *> *components = [[NSMutableArray alloc] init];
unichar buffer[self.length + 1];
NSInteger currentOrigin = 0;
NSInteger currentLength = 0;
[self getCharacters:buffer];
for(NSInteger i = 0; i < self.length; i++)
{
unichar currentChar = buffer[i];
currentLength++;
for(NSInteger n = 0; n < separators.count; n++)
{
NSString *currentDivider = [separators objectAtIndex:n];
if(currentDivider.length == 0)
{
return @[self];
}
else if(currentDivider.length > 1)
{
BOOL goodMatch = NO;
for(NSInteger x = 0; x < currentDivider.length; x++)
{
unichar charInDivider = [currentDivider characterAtIndex:x];
if(charInDivider == currentChar)
{
goodMatch = YES;
}
else
{
goodMatch = NO;
break;
}
if(goodMatch == YES && ((x + 1) != currentDivider.length))
{
i++;
currentLength++;
currentChar = buffer[i];
}
}
if(goodMatch == YES)
{
NSRange newComponentRange = NSMakeRange(currentOrigin, (currentLength - currentDivider.length));
NSString *newComponent = [self substringWithRange:newComponentRange];
currentOrigin = (i + 1);
currentLength = 0;
[components addObject:newComponent];
NSLog(@"%@", components);
}
}
else // If current divider is only one character long.
{
if([currentDivider characterAtIndex:0] == currentChar)
{
NSRange newComponentRange = NSMakeRange(currentOrigin, (currentLength - 1));
NSString *newComponent = [self substringWithRange:newComponentRange];
currentOrigin = (i + 1);
currentLength = 0;
[components addObject:newComponent];
break;
}
}
}
// Handle the end of the string.
if((i + 1) == self.length)
{
NSRange newComponentRange = NSMakeRange(currentOrigin, currentLength);
NSString *newComponent = [self substringWithRange:newComponentRange];
currentOrigin = 0;
currentLength = 0;
[components addObject:newComponent];
}
}
return components;
}
例: "ABCD__EFGHI__JKLMNOP-QRST.UV_WXYZ"
NSLog(@"%@", [test componentsSeparatedByStrings:@[@"__", @"-", @"."]]);
ログ結果: "(ABCD, EFGHI, JKLMNOP, QRST, "UV_WXYZ")
"
より機能液は、各コンポーネントに対して、再帰的に-componentsSeparatedByString:
を適用することですこれは、以前のセパレータ塗布中に得られたものである:
NSStringのカテゴリ
- (NSMutableArray<NSString *> *)gvr_componentsSeparatedByStrings:(NSArray<NSString *> *)separators {
if (separators.count == 0) {
return [NSMutableArray arrayWithObject:self];
}
NSString *separator = [separators firstObject];
NSArray *reducedSeparators = [separators gvr_arrayByRemovingFirstObject];
NSArray *components = [self componentsSeparatedByString:separator];
NSMutableArray *result = [NSMutableArray new];
for (NSString *component in components) {
NSMutableArray *subResult = [component gvr_componentsSeparatedByStrings:reducedSeparators];
[result addObjectsFromArray:subResult];
}
return result;
}
NSArrayのカテゴリ答えとして、私はそれをマークし、これらの分割を命じていなかった場合は、しかし、私の場合には、彼らがしているので、動作しないでしょう
- (NSArray *)gvr_arrayByRemovingFirstObject {
NSMutableArray *result = [NSMutableArray new];
for (NSInteger i = 1; i < self.count; i++) {
[result addObject:self[i]];
}
return [result copy];
}
'sep'が1文字でない場合は動作します。例えば私が '!'の代わりに '!!'で分割したいのであれば – Arefly