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 = @ ...
随机推荐
- [Xcode 实际操作]六、媒体与动画-(2)使用图形上下文转换图片为灰度图
目录:[Swift]Xcode实际操作 本文将演示如何将图片转换为灰度图. 在项目导航区,打开视图控制器的代码文件[ViewController.swift] import UIKit class V ...
- react-native-video的使用
/** * Sample React Native App * https://github.com/facebook/react-native * * @format * @flow */ impo ...
- PAT甲级——1106 Lowest Price in Supply Chain(BFS)
本文同步发布在CSDN:https://blog.csdn.net/weixin_44385565/article/details/90444872 1106 Lowest Price in Supp ...
- Netty(4-1)factorial~总结
本节大纲: 1.Handler的执行顺序2.自定义二进制协议(每条完整数据的组成),从而解决拆包和粘包.3.通过为每个channel创建新的handler,从而解决即使handler中使用全局变量,也 ...
- 浮点数据与IEE754
在计算机系统(包括单片机)中,浮点数(单精度float和双精度的double)对采用IEE-754标准.该标准为 32 位浮点和 64 位双精度浮点二进制小数定义了二进制标准. IEEE 754 用科 ...
- C#远程连接sqlserver时,尝试读取或写入受保护的内存
管理员身份运行 cmd -> 输入 netsh winsock reset
- winform代码生成器(一)
(PS sqlhelper的文件 竟放到 类库里了,第二篇已做了分离,边做边写的 ^_^) 做 Winform 项目时,要拖很多控件,感觉在做重复的事,那就应该用程序来完成,那就自己写一个吧.-- ...
- MS-SQL 时间的操作
1. 当前系统日期.时间 select getdate() 2. dateadd 在向指定日期加上一段时间的基础上,返回新的 datetime 值 例如:向日期加上2天 select dateadd ...
- Memcached分布式原理
http://younglibin.iteye.com/blog/2043761 浅显易懂,值得一读
- rest_framework序列化组件
一.Django自带的序列化组件 ==>对象序列化成json格式的字符串 from django.core import serializers from django.core import ...