NSRegularExpression 使用
需求:
// 后台返回的某个实体
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 使用的更多相关文章
- [iOS]利用系统NSRegularExpression使用正则表达式
// Created by 李东旭 on 16/1/22. // Copyright © 2016年 李东旭. All rights reserved. // #import <UIKit/UI ...
- iOS:使用NSRegularExpression正则去掉一串字符串中所有的特殊字符和标点
一.介绍 在开发中,有时我们需要对一串字符串做特殊的处理后再使用,例如判断是不是特殊字符.去掉所有的特殊字符等.做处理的方法有很多,最简单的就是for循环遍历一个个的比较处理,最好用的应该是使用正则表 ...
- NSRegularExpression iOS自带的正则表达式
以前做验证邮箱,电话号码的时候通常用第三方的正则表达式或者NSPredicate(点这里查看以前的文章),在后期,苹果推出了自己的正则表达式来提供给开发者调用,很方便,功能也强大. 具体可以查看官方文 ...
- NSRegularExpression
aaarticlea/png;base64,iVBORw0KGgoAAAANSUhEUgAAAu4AAAU2CAIAAABFtaRRAAAAAXNSR0IArs4c6QAAAe9pVFh0WE1MOm
- ios 使用NSRegularExpression解析正则表达式
初始化一个 NSRegularExpression 对象 注:_str是要匹配的字符串 NSRegularExpression *regex = [NSRegularExpression regu ...
- iOS中的过滤器和正则表达式(NSPredicate,NSRegularExpression)
参考链接:http://www.cocoachina.com/industry/20140321/8024.html NSPredicate Cocoa提供了一个NSPredicate类,它用来指定过 ...
- 解析URL 获取某一个参数值
/** * 解析URL 获取某一个参数值 * * @param name 需要获取的字段 * @param webaddress URL * * @return 返回的参数对应的 value */ - ...
- iOS中使用正则
一.什么是正则表达式 正则表达式,又称正规表示法,是对字符串操作的一种逻辑公式.正则表达式可以检测给定的字符串是否符合我们定义的逻辑,也可以从字符串中获取我们想要的特定部分.它可以迅速地用极简单的方式 ...
- iOS三种正则表达式
1.利用NSPredicate(谓词)匹配 例如匹配有效邮箱: NSString *email = @"nijino_saki@.com": NSString *regex = @ ...
随机推荐
- 洛谷P2257 YY的GCD(莫比乌斯反演)
传送门 原来……莫比乌斯反演是这么用的啊……(虽然仍然不是很明白) 首先,题目所求如下$$\sum_{i=1}^n\sum_{j=1}^m[gcd(i,j)=prim]$$ 我们设$f(d)$表示$g ...
- Python学习笔记(字典)
今天学习一个python中的基本类型--字典(dictionary) 字典这种数据结构有点像我们平常用的通讯录,有一个名字和这个名字对应的信息.在字典中,名字叫做“键”,对应的内容信息叫做“值”.字典 ...
- python 定位
#字符串定位 使用str.find() 其结果为如下: #列表中元素的定位 使用list.index() 其结果如下:
- Core 事件总
NET Core 事件总线,分布式事务解决方案:CAP 背景 相信前面几篇关于微服务的文章也介绍了那么多了,在构建微服务的过程中确实需要这么一个东西,即便不是在构建微服务,那么在构建分布式应用的过程中 ...
- JS——变量声明、变量类型、命名规范
变量声明: JavaScript是一种弱类型语言,它的变量类型由它的值来决定,var是变量声明. 变量类型: 基本类型:number.string.boolean(布尔类型:var a=true/fa ...
- MongoDB 最初级步骤
对库TEST下的LOG聚集集合中的inserttim字段加索引 步骤(注意:前四步步骤不能错,错了不行): 一,打开F:\mongodb\bin\mongo.exe,也可以用cmd命令指到这个exe执 ...
- c# 类名不同,字段相同,如何快速给类赋值
1,相关的两个类如下:现在我们知道短信的值,如何给微信来赋值呢,需要用到我们的反射,当然字段一一赋值也可以,但是如果字段有100个,这个方法就不行啦 /// <summary> /// 短 ...
- 洛谷 P1690 贪婪的Copy
题目 本题难度较低,操作比较简单,首先对于范围较小的N(<=100),我们可以先跑一遍floyd,求出任意两点之间的最短路.对于很小的p(<=15),我们可以直接考虑全排列,运用到next ...
- POJ3252Round Numbers(数位dp)
题意 给出区间$[A, B]$,求出区间内的数转成二进制后$0$比$1$多的数的个数 $1 \leqslant A, B \leqslant 2,000,000,000$ Sol 比较zz的数位dp ...
- 关于验证码在IE中不刷新的快速解决方法
今天在做验证码的时候发现在IE中,验证码不会刷新,而谷歌等其他浏览器没有问题,所以我想到应该是缓存问题,因为IE默认的设置是如果访问地址没变化就不会去获取而是加载缓存中的内容 所以解决方案就是在验证码 ...