7

对于文本bozo__foo!!bar.baz,如何将包含此内容的 NSString 拆分为(bozo, foo, bar, baz)

也就是说,用字符串(分隔符)和 . 将其分隔在__组件!!.

4

5 回答 5

22

您可以使用 NSCharacterSet 拆分字符串。试试这个

NSString *test=@"bozo__foo!!bar.baz";
NSString *sep = @"_!.";
NSCharacterSet *set = [NSCharacterSet characterSetWithCharactersInString:sep];
NSArray *temp=[test componentsSeparatedByCharactersInSet:set];
NSLog(@"temp=%@",temp);
于 2012-11-23T07:51:19.590 回答
1

我知道这个问题已经得到解答,但这是一种使用多个字符串分隔字符串的方法。这是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")

于 2016-09-18T00:39:56.610 回答
0
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]);
于 2012-11-22T19:28:19.420 回答
0

更多功能的解决方案是-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];
}
于 2017-07-12T11:22:49.917 回答
0

我通过寻找最长的分隔符为我的项目解决了这个问题,用这个分隔符替换其他分隔符,然后在唯一剩下的分隔符上进行分隔。试试这个:

  NSString *test = @"bozo__foo!!bar.baz";
  test = [test stringByReplacingOccurrencesOfString:@"!!" withString:@"__"];
  test = [test stringByReplacingOccurrencesOfString:@"." withString:@"__"];
  NSArray<NSString *> *parts = [test componentsSeparatedByString:@"__"];
于 2019-07-26T08:35:33.153 回答