首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在发现两个或更多空格字符的地方拆分NSString?

如何在发现两个或更多空格字符的地方拆分NSString?
EN

Stack Overflow用户
提问于 2018-06-16 02:23:15
回答 5查看 293关注 0票数 0

给定字符串输入:

代码语言:javascript
复制
@"bonus pay savings            2.69 F";
@"brick and mortar             0.15-B";

所需的输出字符串:

代码语言:javascript
复制
[@"bonus pay savings", @"2.69 F"];
[@"brick and mortar", @"0.15-B"];

我尝试过这种方法:

代码语言:javascript
复制
NSString * str = @"bonus pay savings            2.69 F";
NSArray * arr = [str componentsSeparatedByString:@"   "];
NSLog(@"Array values are : %@",arr);

但我的方法的缺点是我使用3个空格作为分隔符,而空格的数量可以改变。如何才能做到这一点?谢谢。

EN

回答 5

Stack Overflow用户

发布于 2018-06-16 02:32:54

一个使用正则表达式的简单解决方案。

它将所有出现2个或更多({2,})空白字符(\\s)替换为随机的UUID字符串。然后,它将字符串拆分为该UUID字符串。

代码语言:javascript
复制
NSString *separator = [NSUUID UUID].UUIDString; 
NSString *string = @"bonus pay savings            2.69 F";
NSString *collapsedString =  [string stringByReplacingOccurrencesOfString:@"\\s{2,}"
                                                      withString:separator
                                                         options:NSRegularExpressionSearch
                                                           range:NSMakeRange(0, [string length])];
NSArray *output = [collapsedString componentsSeparatedByString:separator];
NSLog(@"%@", output);
票数 0
EN

Stack Overflow用户

发布于 2018-06-16 02:39:20

您可以使用NSRegularExpression拆分字符串。让我们在NSString上创建一个类别

NSString+asdiu.h

代码语言:javascript
复制
@interface NSString (asdiu)

- (NSArray<NSString *> *)componentsSeparatedByRegularExpressionPattern:(NSString *)pattern error:(NSError **)errorOut;

@end

NSString+asdiu.m

代码语言:javascript
复制
@implementation NSString (asdiu)

- (NSArray<NSString *> *)componentsSeparatedByRegularExpressionPattern:(NSString *)pattern error:(NSError **)errorOut {
    NSRegularExpression *rex = [NSRegularExpression regularExpressionWithPattern:pattern options:0 error:errorOut];
    if (rex == nil) { return nil; }

    NSMutableArray<NSString *> *components = [NSMutableArray new];
    __block NSUInteger start = 0;
    [rex enumerateMatchesInString:self options:0 range:NSMakeRange(0, self.length) usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
        NSRange separatorRange = result.range;
        NSRange componentRange = NSMakeRange(start, separatorRange.location - start);
        [components addObject:[self substringWithRange:componentRange]];
        start = NSMaxRange(separatorRange);
    }];
    [components addObject:[self substringFromIndex:start]];
    return components;
}

@end

你可以这样使用它:

代码语言:javascript
复制
NSArray<NSString *> *inputs = @[@"bonus pay savings            2.69 F", @"brick and mortar             0.15-B"];
for (NSString *input in inputs) {
    NSArray<NSString *> *fields = [input componentsSeparatedByRegularExpressionPattern:@"\\s\\s+" error:nil];
    NSLog(@"fields: %@", fields);
}

输出:

代码语言:javascript
复制
2018-06-15 13:38:13.152725-0500 test[23423:1386429] fields: (
    "bonus pay savings",
    "2.69 F"
)
2018-06-15 13:38:13.153140-0500 test[23423:1386429] fields: (
    "brick and mortar",
    "0.15-B"
)
票数 0
EN

Stack Overflow用户

发布于 2018-06-16 07:01:13

如果您可以假设输入字符串中只有2个字段,我将使用一个有限的split方法like this one,它总是返回一个包含2个项目的数组,然后使用stringByTrimmingCharactersInSet“修剪”第二个项目的空格。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50880909

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档