Object-C替換自定義佔位符"${}"

前言

oc字符串替換一般使用系統提供的%@、%d、%u等,但是有的時候根據需求我們需要自定義佔位符,如下:

我們上報服務器數據時,需要向Facebook的渠道做一個轉發,eventName是轉發的事件名稱,其中${level}是需要解析本地數據level,如level = 10,則eventName是爲trackleveldone_10.

 //此數據是服務器下發給SDK的,告訴SDK轉發的渠道、事件名稱。
 {
         "channel":"Facebook",
         "eventName":"trackleveldone_${params.level}"
   }

同時,一個字符串中,可能存在多個${},如:${params.name}_trackleveldone_${params.level}${params.name}_tracklevel_${params.coin}_done_${params.level}等等。

實現

  1. 首先獲取,要替換的字符串。
//查找要替換的屬性
-(NSArray *) findReplaceHold:(NSString *)holdString {
    if (![holdString isKindOfClass: [NSString class]]) {
        return nil;
    }
    //保存要替換的字符串
    NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:1];
    BOOL flag = TRUE;
    while (flag) {
        //查詢"${}" 
        NSRange startRange = [holdString rangeOfString:@"${"];
        NSRange endRange = [holdString rangeOfString:@"}"];
        //只有兩個都匹配,才裁剪,否則表示沒有匹配的了。
        if (startRange.location == NSNotFound || endRange.location == NSNotFound) {
            flag = FALSE;
            return array;
        }
        //得出${}包圍的字符串
        NSRange sliceRange = NSMakeRange(startRange.location + startRange.length, endRange.location - startRange.location - startRange.length);
        
        if ((startRange.location + startRange.length >= holdString.length) || (endRange.location - startRange.location - startRange.length >= holdString.length)) {
            flag = FALSE;
            return nil;
        }
        //獲取${}包圍的字符串
        NSString* content = [holdString substringWithRange:sliceRange];
        if (![content isKindOfClass:[NSString class]]) {
            flag = FALSE;
             return nil;
        }
        [array addObject:content];
        //去掉${}的內容
        if (startRange.location >= holdString.length) {
            flag = FALSE;
            return nil;
        }
        NSString* startContent = [holdString substringWithRange:NSMakeRange(0,startRange.location)];
        
        if ((endRange.location + endRange.length >= holdString.length) ||
            holdString.length - endRange.location - endRange.length >= holdString.length) {
            //表示”}“後邊沒有數據了
            holdString = startContent;
            continue;
        }
        
        NSString* endContent = [holdString substringWithRange:NSMakeRange(endRange.location + endRange.length, holdString.length - endRange.location - endRange.length)];
        //組裝數據,"${"前  +  "}"後
        holdString = [NSString stringWithFormat:@"%@%@",startContent,endContent];
    } 
    return array;
}
  1. 獲取到替換的字符串後,對此字符串做替換
//查找要替換的屬性,replaceValue是key即是上邊查到的字符串,value是要替換的值。
-(NSString *) replaceHold:(NSString *)holdString replaceValue:(NSDictionary *)replaceValue {
    if (![holdString isKindOfClass: [NSString class]] || ![replaceValue isKindOfClass:[NSDictionary class]]) {
        return nil;
    }
    BOOL flag = TRUE;
    while (flag) {
        //查詢"${ }"
        NSRange startRange = [holdString rangeOfString:@"${"];
        NSRange endRange = [holdString rangeOfString:@"}"];
        
        if (startRange.location == NSNotFound || endRange.location == NSNotFound) {
            flag = FALSE;
            return holdString;
        }
        
        //得出${}包圍的字符串
        NSRange sliceRange = NSMakeRange(startRange.location + startRange.length, endRange.location - startRange.location - startRange.length);
        //獲取${}包圍的字符串
        NSString* content = [holdString substringWithRange:sliceRange];
        if (![content isKindOfClass:[NSString class]]) {
            flag = FALSE;
            return nil;
        }
        //去掉${}的內容
        if (startRange.location >= holdString.length) {
            flag = FALSE;
            return nil;
        }
        NSString* startContent = [holdString substringWithRange:NSMakeRange(0,startRange.location)];
        
        if ((endRange.location + endRange.length >= holdString.length) ||
            holdString.length - endRange.location - endRange.length >= holdString.length) {
            //組裝數據,"${"前  +  中
            holdString = [NSString stringWithFormat:@"%@%@",startContent,replaceValue[content]];
            continue;
        }
        NSString* endContent = [holdString substringWithRange:NSMakeRange(endRange.location + endRange.length, holdString.length - endRange.location - endRange.length)];
        
        //組裝數據,"${"前  +   中   +  "}"後
        holdString = [NSString stringWithFormat:@"%@%@%@",startContent,replaceValue[content],endContent];
    } 
    return holdString;
}
  1. 使用方式
 //1.獲取要替換的字符串
  NSArray* keyArray = [self findReplaceHold:eventName];
  //2. 根據keyArray 去獲取程序中對應的value
  NSMutableDictionary* keyDict = [self  findKeyValue: keyArray];
 //3.替換字符串
  NSString* finalEventName = [self replaceHold:eventName replaceValue:keyDict];
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章