【问题标题】:NSString Split String Based on Numeric valuesNSString 根据数值拆分字符串
【发布时间】:2014-10-11 05:31:59
【问题描述】:

我希望在拆分我的一个 NSString 值时获得一些帮助。请考虑以下内容:

NSString *string = @"_o_t_d_n__";

基本上,我想根据下面存储在 NSArray 中的数字分隔符将上面的 NSString *string 分割成 3 个单独的字符串值:

NSArray *values = [NSArray arrayWithObjects: @3, @2, @5];

根据这些分隔符值,这将导致以下结果:

3 = @"_o_"
2 = @"t_"
6 = @"d_n__"

循环遍历这个数组,根据数组中包含的数值对字符串进行分段,最好的方法是什么?

【问题讨论】:

    标签: ios objective-c split nsstring substring


    【解决方案1】:

    试试这个:

    NSArray *array = @[@(3),@(2),@(5)];
    NSUInteger loc = 0;
    for (int i = 0; i < [array count]; i++) {
        NSUInteger len = [[array objectAtIndex:i] unsignedIntegerValue];
        NSString *subStr = [string substringWithRange:NSMakeRange(loc, len)];
        loc += len;
    }
    

    如果要循环遍历NSString,做一个char指针,比第一种方法稍微快一点。

    NSString *string = @"_o_t_d_n__";
    const char *c = [string cStringUsingEncoding:NSUTF8StringEncoding];
    char *myData = calloc(3, 1);
    for (int i = 0, j = 0; i < [string length]; i++, j++) {
        myData[j] = c[i];
        if (i == 2 || i == 4 || i == 9) {
            NSString *string = [[NSString alloc] initWithBytes:myData length:sizeof(myData) encoding:NSUTF8StringEncoding];
            NSLog(@"%@",string);
            if (i == 2) myData = realloc(myData, 2);
            if (i == 4) myData = realloc(myData, 5);
            j = -1;
        }
    }
    free(myData);
    

    【讨论】:

    • 谢谢。当然,这确实让我更清楚。我可以通过循环以某种方式做到这一点吗?
    • 看准队友。非常感谢!
    【解决方案2】:

    我会使用正则表达式来做到这一点。以下是我的做法:

     let string = "_o_t_d_n__"
     let first = 3
     let second = 2
     let third = 5
     let expression = NSRegularExpression.regularExpressionWithPattern("([a-z]{\(first)})([a-z]{\(second)})([a-z]{\(third),})", options: nil, error: nil)
     let range = NSMakeRange(0, string.length)
     expression.enumerateMatchesInString(string, options: nil, range: range, usingBlock:{ (result, MatchingFlags, unsafePointer) in
             let firstResult = string.substringWithRange(result.rangeAtIndex(1))
             let secondResult = string.substringWithRange(result.rangeAtIndex(2))
             let thirdResult = string.substringWithRange(result.rangeAtIndex(3))
     })
    

    需要额外的验证检查,但这是基本思想。

    【讨论】:

    • 顺便说一下,这是 SWIFT 代码。 Objective-c 是一样的。
    猜你喜欢
    • 1970-01-01
    • 2018-05-12
    • 2021-04-16
    • 1970-01-01
    • 1970-01-01
    • 2019-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多