【问题标题】:Create NSArray of keywords starting/ending with % inside a string在字符串中创建以 % 开头/结尾的关键字的 NSArray
【发布时间】:2015-10-20 15:57:32
【问题描述】:

我有一个长字符串,其中包含以百分号开头和结尾的关键字。例如:

我的名字是%user_username%,我住在%location_address%。你可以 联系我%user_phone%

我将使用什么方法来提取所有以 % 开头和结尾的字符串并将它们放入 NSArray 以便我可以用正确的文本表示替换它们?

【问题讨论】:

  • 您可以遍历字符串中的字符,每次到达 % 字符时,您都会创建一个新的 NSMutableString 并开始将后面的字符附加到它,直到您到达下一个 % 字符,将您的 NSMutableString 添加到你的数组
  • 这听起来像是一项昂贵的操作。
  • 你可以使用 NSRegularExpression "%.*?%" 和 -[matchesInString:options:range:]
  • 这就是NSScanner 的用途

标签: objective-c nsstring nsarray


【解决方案1】:

假设您感兴趣的字符串中没有% 符号(例如“a%ab%b%c”),您可以使用componentsSeparatedByString:componentsSeparatedByCharactersInSet: 来获取由% 签名。从那里,很容易找出该数组中的哪些字符串在百分号之间,哪些是不必要的。

我认为,尽管在内部,这些方法很可能实现为类似于寻找%s 的循环。也许他们在大字符串上并行搜索,或者使用字符串内部结构的特殊知识来加快搜索速度——这是我能看到的加快搜索速度的唯一方法,假设你坚持保留所有内容在% 分隔的字符串中(如果速度确实是个问题,那么答案可能是使用替代表示)。

【讨论】:

    【解决方案2】:

    这是我想出的有效方法:

    - (NSArray *)replaceKeywords:(NSString *)keywordString {
    
        NSString *start =   @"%";
        NSString *end =     @"%";
        NSMutableArray* strings = [NSMutableArray arrayWithCapacity:0];
    
        NSRange startRange = [keywordString rangeOfString:start];
    
        for( ;; ) {
    
            if (startRange.location != NSNotFound) {
    
                NSRange targetRange;
    
                targetRange.location = startRange.location + startRange.length;
                targetRange.length = [keywordString length] - targetRange.location;
    
                NSRange endRange = [keywordString rangeOfString:end options:0 range:targetRange];
    
                if (endRange.location != NSNotFound) {
    
                    targetRange.length = endRange.location - targetRange.location;
                    [strings addObject:[keywordString substringWithRange:targetRange]];
    
                    NSRange restOfString;
    
                    restOfString.location = endRange.location + endRange.length;
                    restOfString.length = [keywordString length] - restOfString.location;
    
                    startRange = [keywordString rangeOfString:start options:0 range:restOfString];
    
                } else {
                    break;
                }
    
            } else {
                break;
            }
    
        }
    
        return strings;
    
    }
    

    我对@9​​87654321@的方法稍作修改

    【讨论】:

      猜你喜欢
      • 2017-11-08
      • 1970-01-01
      • 1970-01-01
      • 2021-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多