需求:

// 后台返回的某个实体
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. [Xcode 实际操作]六、媒体与动画-(2)使用图形上下文转换图片为灰度图

    目录:[Swift]Xcode实际操作 本文将演示如何将图片转换为灰度图. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class V ...

  2. react-native-video的使用

    /** * Sample React Native App * https://github.com/facebook/react-native * * @format * @flow */ impo ...

  3. PAT甲级——1106 Lowest Price in Supply Chain(BFS)

    本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90444872 1106 Lowest Price in Supp ...

  4. Netty(4-1)factorial~总结

    本节大纲: 1.Handler的执行顺序2.自定义二进制协议(每条完整数据的组成),从而解决拆包和粘包.3.通过为每个channel创建新的handler,从而解决即使handler中使用全局变量,也 ...

  5. 浮点数据与IEE754

    在计算机系统(包括单片机)中,浮点数(单精度float和双精度的double)对采用IEE-754标准.该标准为 32 位浮点和 64 位双精度浮点二进制小数定义了二进制标准. IEEE 754 用科 ...

  6. C#远程连接sqlserver时,尝试读取或写入受保护的内存

    管理员身份运行 cmd ->  输入 netsh winsock reset

  7. winform代码生成器(一)

    (PS  sqlhelper的文件 竟放到 类库里了,第二篇已做了分离,边做边写的 ^_^) 做 Winform  项目时,要拖很多控件,感觉在做重复的事,那就应该用程序来完成,那就自己写一个吧.-- ...

  8. MS-SQL 时间的操作

    1. 当前系统日期.时间 select getdate()  2. dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值 例如:向日期加上2天 select dateadd ...

  9. Memcached分布式原理

    http://younglibin.iteye.com/blog/2043761 浅显易懂,值得一读

  10. rest_framework序列化组件

    一.Django自带的序列化组件  ==>对象序列化成json格式的字符串 from django.core import serializers from django.core import ...