需求:

// 后台返回的某个实体
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. IT兄弟连 Java语法教程 编写Java源代码

    现在我们来一步一步的编写第一个Java程序,鼎鼎大名的“HelloWorld”. 编写Java源代码 编写Java源代码可以使用任何无格式的文本编辑器,在Windows操作系统上可以使用记事本.Edi ...

  2. IOS 版本控制判断

    // 版本判断#define SYSTEM_VERSION(ver) [[[UIDevice currentDevice] systemVersion] compare:ver] != NSOrder ...

  3. UVA - 1330 City Game

    InputThe rst line of the input le contains an integer K | determining the number of datasets. Next l ...

  4. katalon studio配置git与git项目创建

    katalon 是一款在2015年诞生的可以安装在windows.macOS.linux操作系统上,基于selenium 和 Appium 测试框架,并集成了这些框架的优点的自动化测试工具.关于这个工 ...

  5. 3分钟简单了解 prototype 和 __proto__

    关于prototype 1. 所有的函数都会有一个prototype属性,属性值是一个普通对象: 2. 当我们去new一个构造函数的实例时,构造函数的原型对象(prototype)会被赋值给它实例的[ ...

  6. ios Realm的使用 本地数据存储

    引入需要的文件 pod 'RealmSwift' pod 'Realm' 然后在命令行使用 (首先应该cd到项目的根目录)输入 pod install 等待下载就行了(这个下载有点费劲,其他的插件包下 ...

  7. DRF教程8-过滤

    在写后端api时,经常需要使用各种过滤条件,可以使用Q对查询集进行过滤,这里介绍一个新玩意儿 以下是基础文档 https://django-filter.readthedocs.io/en/maste ...

  8. Leetcode:单调数列

    题目 如果数组是单调递增或单调递减的,那么它是单调的. 如果对于所有 i <= j,A[i] <= A[j],那么数组 A 是单调递增的. 如果对于所有 i <= j,A[i]> ...

  9. [TCP/IP]ICMP和IGMP的区别

    ICMP(Internet 控制消息协议,Internet Control Message Protocol)协议用来给IP协议提供控制服务,允许路由器或目标主机给数据的发送方提供反馈信息.需要发送反 ...

  10. java中存储金额

    很早之前, 记得一次面试, 面试官问存储金钱用什么数据类型? 当时只知道8种数据类型(boolean, byte, short, int, long, float, double, char)的我, ...