需求:

// 后台返回的某个实体
reminder = {
cost = ,
type = ,
template = 可免费做某事{time}分钟,超过将按{cost}K元收费,
time =
}
template 对应的字符串为后台返回,里面会动态出现 {key} 未知个数的key,然后根据 {key} 找到 reminder 实体里面相应的 key 对应的内容,替换 template ,拼成一段完成的话。

我的实现方案:
// 公共部分
NSMutableString *title = [[NSMutableString alloc] initWithString:@"可免费做某事{time}分钟,超过将按{cost}元收费"];
NSDictionary *dict = @{@"time" : @"",
@"cost" : @""};

方案一:

#pragma mark - 方案一
- (void)combineString:(NSString *)origalTitle dic:(NSDictionary *)dict {
if (!origalTitle.length) { return; }
NSMutableString *title = [[NSMutableString alloc] initWithString:origalTitle];
NSString *pattern = @"\\{\\w*\\}";
NSRegularExpression *regx = [[NSRegularExpression alloc] initWithPattern:pattern options: error:nil];
NSArray<NSTextCheckingResult *> *resultArr = [regx matchesInString:title options: range:NSMakeRange(, title.length)];
if (!resultArr.count) { return; } [resultArr enumerateObjectsUsingBlock:^(NSTextCheckingResult * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) { NSRange range = obj.range;
NSString *key = [title substringWithRange:range];
NSString *newKey = [key substringWithRange:NSMakeRange(, key.length - )]; NSString *replace = [regx stringByReplacingMatchesInString:title options: range:range withTemplate:dict[newKey]];
NSLog(@"replace____%@", replace); [self combineString:replace dic:dict]; *stop = YES;
}];
}

方案二:

#pragma mark - 方案二
- (void)sec_combineString:(NSString *)origalTitle dic:(NSDictionary *)dict {
if (!origalTitle.length) { return; }
NSMutableString *title = [[NSMutableString alloc] initWithString:origalTitle];
NSString *pattern = @"\\{\\w*\\}";
NSRegularExpression *regx = [[NSRegularExpression alloc] initWithPattern:pattern options: error:nil]; // 匹配结果
__block NSMutableArray<NSString *> *rangeArray = [NSMutableArray array];
[regx enumerateMatchesInString:title options: range:NSMakeRange(, title.length) usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
if (flags != NSMatchingInternalError) {
[rangeArray addObject:NSStringFromRange(result.range)];
}
}]; // 遍历NSRange数组
[rangeArray enumerateObjectsUsingBlock:^(NSString * _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
NSRange range = NSRangeFromString(obj);
NSString *key = [title substringWithRange:range];
NSString *newKey = [key substringWithRange:NSMakeRange(, key.length - )]; NSString *replace = [regx stringByReplacingMatchesInString:title options: range:range withTemplate:dict[newKey]];
[self sec_combineString:replace dic:dict];
*stop = YES;
}];
}
NSRegularExpression 入门介绍,可以参考我之前的一篇博客!传送门关于正则表达式的入门级教程,可以参考该文章,我也是参考这边篇文章做的pattern。传送门
尊重作者劳动成果,转载请注明: 【kingdev】

NSRegularExpression 使用的更多相关文章

  1. [iOS]利用系统NSRegularExpression使用正则表达式

    // Created by 李东旭 on 16/1/22. // Copyright © 2016年 李东旭. All rights reserved. // #import <UIKit/UI ...

  2. iOS:使用NSRegularExpression正则去掉一串字符串中所有的特殊字符和标点

    一.介绍 在开发中,有时我们需要对一串字符串做特殊的处理后再使用,例如判断是不是特殊字符.去掉所有的特殊字符等.做处理的方法有很多,最简单的就是for循环遍历一个个的比较处理,最好用的应该是使用正则表 ...

  3. NSRegularExpression iOS自带的正则表达式

    以前做验证邮箱,电话号码的时候通常用第三方的正则表达式或者NSPredicate(点这里查看以前的文章),在后期,苹果推出了自己的正则表达式来提供给开发者调用,很方便,功能也强大. 具体可以查看官方文 ...

  4. NSRegularExpression

    aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAu4AAAU2CAIAAABFtaRRAAAAAXNSR0IArs4c6QAAAe9pVFh0WE1MOm

  5. ios 使用NSRegularExpression解析正则表达式

    初始化一个   NSRegularExpression 对象 注:_str是要匹配的字符串 NSRegularExpression *regex = [NSRegularExpression regu ...

  6. iOS中的过滤器和正则表达式(NSPredicate,NSRegularExpression)

    参考链接:http://www.cocoachina.com/industry/20140321/8024.html NSPredicate Cocoa提供了一个NSPredicate类,它用来指定过 ...

  7. 解析URL 获取某一个参数值

    /** * 解析URL 获取某一个参数值 * * @param name 需要获取的字段 * @param webaddress URL * * @return 返回的参数对应的 value */ - ...

  8. iOS中使用正则

    一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...

  9. iOS三种正则表达式

    1.利用NSPredicate(谓词)匹配 例如匹配有效邮箱: NSString *email = @"nijino_saki@.com": NSString *regex = @ ...

随机推荐

  1. 同余方程 (codevs1200)

    题目描述××× 求关于 x 的同余方程 ax ≡ 1 (mod b)的最小正整数解. 输入输出格式××× 输入格式: 输入只有一行,包含两个正整数 a, b,用一个空格隔开. 输出格式: 输出只有一行 ...

  2. servlet连接mysql数据库和oracle数据库

    连接mysql数据库 package dao; import java.sql.Connection; import java.sql.DriverManager; import java.sql.P ...

  3. GridSearchCV.grid_scores_和mean_validation_score报错

    目录 GridSearchCV.grid_scores_和mean_validation_score报错 0. 写在前面 1. 问题描述和解决过程 2. 不想比比直接看结果部分 GridSearchC ...

  4. 6.计算字段 ---SQL

    提示:客户端与服务器的格式在SQL语句内可完成的许多转换和格式化工作都可以直接在客户端应用程序内完成.但一般来说,在数据库服务器上完成这些操作比在客户端中完成要快得多. 一.拼接字段 拼接(conca ...

  5. Codeforces 1141F2(贪心、预处理)

    要点 一开始dp然后码力太辣鸡并且算法带假于是调了很久一交还WA在28-- 吐槽完毕.后来想拿栈优化dp时发现其实完全不需要dp,贪心选取即可,当前的不兼容就干脆不要它了,结果不会变差.然后想要什么就 ...

  6. Linux修改war包中文件

    rm -rf /tmp/wiq.warcp /u02/wms_dev/wiq-app/wars/wiq.war /tmpcd /tmp jar xvf wiq.war vim WEB-INF/clas ...

  7. 转 db_file_multiblock_read_count

    http://www.laoxiong.net/table_scan_and_buffer_cache.html 全表扫描与buffer cache https://www.cnblogs.com/R ...

  8. E. Selling Souvenirs 不会做

    http://codeforces.com/contest/808/problem/E 不理解为什么dp = {cost, cnt1, cnt2}可以 而dp = {cost, cnt1, cnt2, ...

  9. Linux下无图形界面安装Matlab

    1 下载R2015b_glnxa64.iso和破解文件Matlab+2015b+Linux64+Crack 百度网盘可以直接搜索资源.推荐一个可以多线程下载百度网盘超大文件的工具Aria2,均速1.3 ...

  10. C#使用GZipStream实现压缩和解压缩

    前言 我们在项目中,有可能会遇到存入到数据库或者传输的数据量比较大,这个时候,就可以考虑在存入数据库或者发送传输之前,将数据压缩下,当从数据库中取出时,再解压还原数据. 正文 废话不多说,我封装了一个 ...