iOS 获取所有子字符串Rang

现在APP开发对效果要求越来与丰富,各种特效层出不穷。其中以动画效果和文字以富文本展示居多。

在网上也看了好几种方法,感觉有的处理的麻烦了,下面是我总结的获取子字符串所有Rang的一些方法:

字符串做富文本处理需要通过NSMutableAttributedString来处理,先创建一个NSMutableAttributedString对象:

NSMutableAttributedString *attribtStr = [[NSMutableAttributedString alloc] initWithString:@"父字符串"];

1、使用NSRegularExpression来处理

//初始化NSRegularExpression  NSRegularExpression *regularExpression = [NSRegularExpression regularExpressionWithPattern:@"你的正则表达式" options:0 error:nil];
//遍历字符串,usingBlock中返回子字符串的状态,在usingBlock中处理子字符串[regularExpression enumerateMatchesInString:attribtStr.string options:0 range:NSMakeRange(0, attribtStr.string.length) usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
        //给子字符串添加双删除线
        [attribtStr addAttribute:NSStrikethroughStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleDouble] range:result.range];
        //删除线设置为红色
        [attribtStr addAttribute:NSStrikethroughColorAttributeName value:[UIColor redColor] range:result.range];
    }];

上面方法是直接在遍历中处理匹配的子字符串,下面的是先得到所有子字符串的状态集,再做对应处理:

NSArray *regularExpressionArr = [regularExpression matchesInString:attribtStr.string options:0 range:NSMakeRange(0, attribtStr.string.length)];

得到子字符串的数组集合,需要做什么处理,通过循环判断就可以完成了。

for (NSTextCheckingResult *result in regularExpressionArr) {
        NSRange rang = [result range];
        NSLog(@"%lu",rang.location);

        [attribtStr addAttribute:NSStrikethroughStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleDouble] range:result.range];
        [attribtStr addAttribute:NSStrikethroughColorAttributeName value:[UIColor redColor] range:result.range];
    }

NSRegularExpression的下面几个方法在其他情况下也是很好用的:

//获取子字符串数目- (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
//获取第一个子字符串的NSTextCheckingResult- (nullable NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
//获取指定rang内第一个符合要求的子字符串- (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;

2.通过递归获得所有子字符串的rang数组(递归的优缺点就不在扯了,慎用)

//通过递归获取所有子字符串location
- (void)rangeOfString:(NSString*)searchString fatherString:(NSString*)fatherStr options:(NSStringCompareOptions)mask range:(NSRange)rangeOfReceiverToSearch {
//获取指定范围内第一个匹配的子字符串rang,和上面NSRegularExpression的一个方法效果一样NSRange rang = [fatherStr rangeOfString:searchString options:mask range:rangeOfReceiverToSearch];//判断搜寻范围来决定是否完成搜寻
    if (rang.location >fatherStr.length - searchString.length) {
        return;
    }//NSRang不能存储在数组中,所以这里存的是rang的location
    [strLocationRangArr addObject:[NSNumber numberWithInteger:rang.location]];//递归搜寻
    [self rangeOfString:searchString fatherString:fatherStr options:mask range:NSMakeRange(rang.location+searchString.length, fatherStr.length-rang.location-searchString.length)];
}

调用示例:

strLocationRangArr = [NSMutableArray array];
    [self rangeOfString:@"CoreText" fatherString:attribtStr.string options:0 range:NSMakeRange(0, attribtStr.string.length)];
    for (NSNumber *location in strLocationRangArr) {
        [attribtStr addAttribute:NSStrikethroughStyleAttributeName value:[NSNumber numberWithInteger:NSUnderlineStyleDouble] range:NSMakeRange([location integerValue], 8)];
        [attribtStr addAttribute:NSStrikethroughColorAttributeName value:[UIColor redColor] range:NSMakeRange([location integerValue], 8)];
    }

3.通过字符串- (NSArray<NSString *> *)componentsSeparatedByString:(NSString *)separator;方法获得的切割数组处理获得子字符串rang集合。

 NSArray *arr = [attribtStr.string componentsSeparatedByString:@"searchString"];

通过数组的子字符串去匹配attribtStr.string获取searchString的location,

这种方法需要处理的地方比较多,首先要考虑arr中第一个、最后一个和连续的是否是@“”,在着就是数组中不可避免会出现相同切割为相同的子串。

例如:@“123654789123654789”这样要[email protected]“654”就会出现两个@“123”和@“789”,在判断的时候要在此处处理重复问题,小的表示有了上面两种方法就没有在对这种想法再做深入的实现。

相对NSRegularExpression的简单快速的,其他方法用来作为思路还是不错的。

时间: 2024-10-26 16:45:30

iOS 获取所有子字符串Rang的相关文章

IOS 获取系统版本字符串,并且转化成float类型

pcDuino3下支持mmc启动,官方的Uboot是采用SPL框架实现的,因为内部的SRAM空间达到32K,我们完全可以在这32K空间内编写一个完整可用小巧的bootloader来完成引导Linux kernel的目的. 我们首先介绍下SPL框架,可以先看下<GNU ARM汇编--(十八)u-boot-采用nand_spl方式的启动方法>和<GNU ARM汇编--(十九)u-boot-nand-spl启动过程分析>,NAND_SPL也算是SPL框架下的一种模式. 当使用Nand f

iOS 获取当前时间格式化字符串

iOS 获取当前时间格式化字符串 太阳火神的美丽人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的美丽人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则,出自本博客的文章拒绝转载或再转载,谢谢合作. // 获取系统当前时间 NSDate * date = [NSDate date]; NSDateFormatt

iOS开发之获取一段字符串中的中文字和中文字符

#pragma mark -获取一段字符串中的中文字 + (NSArray *)getAStringOfChineseWord:(NSString *)string { if (string == nil || [string isEqual:@""]) { return nil; } NSMutableArray *arr = [[NSMutableArray alloc]init]; for (int i=0; i<[string length]; i++) { int a

iOS获取汉字的拼音

在iOS开发中经常涉及到汉字的排序,最常见的就是需要根据首字母的字符顺序排列,比如常见的通讯录等.总结出来,大致可以分为两种方法,其中参考文献[1]中提供的方法十分复杂,并且代码量很大,不建议采用.另一种方法是直接采用Core Foundation中提供的方法,十分简单,封装好的代码如下: 1 - (NSString *)transform:(NSString *)chinese{ 2 //将NSString装换成NSMutableString 3 NSMutableString *pinyin

iOS获取设备唯一标识的各种方法?IDFA、IDFV、UDID分别是什么含义?

iOS获取设备唯一标识的各种方法?IDFA.IDFV.UDID分别是什么含义? [摘要:1.UDID (Unique Device Identifier) UDID的齐称是Unique Device Identifier,望文生义,它便是苹果IOS装备的独一辨认码,它由40个字符的字母战数字构成.正在良多须要限定] 一.UDID (Unique Device Identifier) UDID的全称是Unique Device Identifier,顾名思义,它就是苹果IOS设备的唯一识别码,它由

获取两个字符串中最大相同子串

2.获取两个字符串中最大相同子串.第一个动作:将短的那个串进行长度一次递减的子串打印. "cvhellobnmtanop" "andefc" 思路: 1,将短的那个子串按照长度递减的方式获取到. 2,将每获取到的子串去长串中判断是否包含,如果包含,已经找到! package tan; class Test { public static String getMaxSubString(String s1,String s2) { String max = "

检测SDWebImage有没有缓存图片 IOS 获取网络图片大小

NSURL *url = [NSURL URLWithString:[model.content objectForKey:@"image"]];             //请求网络地址数据的同步方法             //因为这个方法在子线程(全局队列)中执行,所以不需要考虑死线程的问题             SDWebImageManager *manager = [SDWebImageManager sharedManager];              [manag

iOS获取本地视频和网络URL视频的缩略图方法

iOS获取本地视频和网络URL视频的缩略图方法 字数222 阅读612 评论0 喜欢13 首先大家先添加AVFoundation和CoreMedia.framework两个框架 第一种本地视频获取缩略图 NSString *path = @"www.51ios.net/本地路径" MPMoviePlayerController *51iosMPMovie = [[MPMoviePlayerController alloc] initWithContentURL:[NSURL fileU

iOS中日期和字符串的相互转化(特殊)

例1.  从服务器段获取到的字符串转化为时间如:转化1416882712000 //网络请求获取的数据 NSString *time = [NSStringstringWithFormat:@"%@",[[dateListobjectAtIndex:indexPath.row]gradeDate]];    NSInteger num = [time integerValue]/1000;(重点) NSDateFormatter *formatter = [[[NSDateFormat