iOS正则表达式使用
2015-09-13 21:31
495 查看
目标:解出以下题目:
在我们使用的微博中是可以去@别人的,那么在我们使用的时候就需要去处理一些字符串了。具体要求如下:
开始为一个以字母或是数字开始然后添加@符号,中间不论是什么东西,也可以有反斜杠,不过有反斜杠的字母都作为本身处理,以空格或是最终行结尾结束。如果空格前有反斜杠则不作为空格处理,直接向下进行搜索直至找到所需要的空格为止
代码解析用到知识点:
1. 字符串处理,RangeOfString:withOption 使用正则表达式进行处理
2. 按照逻辑,先找到所需要的@符号,再找到其后的空格
3. 将所有的反斜杠用@“”替换掉,可以通过使用stringByRepla
具体封装方法如下:
处理掉所有的反斜杠
输入的字符串,在使用的时候会自动进行转义,如果输入的是一个反斜杠,在OC中传输的时候就会发现其会转成两个反斜杠。所有相关操作也是这样。
用到的知识点:
/*
自定义能够匹配 '多种字符' 的表达式
// \\w可以处理英文与数字两种 碰到其他的字符就会作为一个结束点进行处理,匹配字母或数字或下划线或汉字
. 可以匹配除换行符以外的任意字符
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
使用[]包含一系列字符,能够匹配其中任意一个字符。
[^]包含一系列字符,只能匹配其中字符外的任意一个字符,同样的道理,虽然可以匹配其中任意一个,但是只能是一个,不是多个。
[] 本身就隐含了“或”关系,在[]中使用“|”表示“或”的关系是不对的,这样做只是多了一个普通字符“|”,用来匹配“|”字符本身,()也是同样的道理
示例:
[ab5@] : 匹配 "a" 或 "b" 或 "5" 或 "@"
[^abc] : 匹配 "a","b","c" 之外的任意一个字符
[f-k] : 匹配 "f"~"k" 之间的任意一个字母
[^A-F0-3] : 匹配 "A"~"F","0"~"3" 之外的任意一个字符
修饰匹配次数的特殊符号
{n} : 表达式重复n次
{m,n} : 表达式至少重复m次,最多重复n次
{m,} : 表达式至少重复m次
? : 匹配表达式0次或者1次,相当于 {0,1}
+ : 表达式至少出现1次,相当于 {1,}
* : 表达式不出现或出现任意次,相当于 {0,}
其他一些代表抽象意义的特殊符号
^ : 与字符串开始的地方匹配,不匹配任何字符
$ : 与字符串结束的地方匹配,不匹配任何字符
\b : 匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符
() : 表示一个组,这个组是同时进行处理的,组中的元素会加在一起进行
*/
在我们使用的微博中是可以去@别人的,那么在我们使用的时候就需要去处理一些字符串了。具体要求如下:
开始为一个以字母或是数字开始然后添加@符号,中间不论是什么东西,也可以有反斜杠,不过有反斜杠的字母都作为本身处理,以空格或是最终行结尾结束。如果空格前有反斜杠则不作为空格处理,直接向下进行搜索直至找到所需要的空格为止
代码解析用到知识点:
1. 字符串处理,RangeOfString:withOption 使用正则表达式进行处理
2. 按照逻辑,先找到所需要的@符号,再找到其后的空格
3. 将所有的反斜杠用@“”替换掉,可以通过使用stringByRepla
具体封装方法如下:
- (void)dealWithString:(NSString *)str { NSString *regexStringForHead = @"\\w@"; NSString *regexStringForFooter = @"(\\w\\s)"; NSRange rangeHead = [str rangeOfString:regexStringForHead options:NSRegularExpressionSearch]; NSInteger headIndex = 0; NSInteger footerIndex = 0; if (rangeHead.location != NSNotFound) { headIndex = rangeHead.location + rangeHead.length; NSLog(@"headIndex %d",headIndex); NSString *strForFooter = [str substringFromIndex:rangeHead.length + rangeHead.location]; // 在头range后的串,从中查找结束需要的串 NSRange rangeFooter = [strForFooter rangeOfString:regexStringForFooter options:NSRegularExpressionSearch]; if (rangeFooter.location != NSNotFound) { footerIndex = rangeFooter.location + rangeFooter.length; NSLog(@"FooterIndex %d",footerIndex); NSRange rangeTemp = NSMakeRange(headIndex, footerIndex-1); // 去除最后的空格 NSString *tempStr = [str substringWithRange:rangeTemp]; [self.dataArr addObject:tempStr]; str = [str substringFromIndex:rangeTemp.length + rangeTemp.location]; [self dealWithString:str]; } else{ // 到最终也没有找到 str = [str substringFromIndex:headIndex]; [self.dataArr addObject:str]; } } }
处理掉所有的反斜杠
for (int i = 0; i<self.dataArr.count; i++) { NSString *str = self.dataArr[i]; str = [str stringByReplacingOccurrencesOfString:@"\\" withString:@""]; self.dataArr[i] = str; } NSLog(@"展示最终结果:%@",self.dataArr);
输入的字符串,在使用的时候会自动进行转义,如果输入的是一个反斜杠,在OC中传输的时候就会发现其会转成两个反斜杠。所有相关操作也是这样。
用到的知识点:
/*
自定义能够匹配 '多种字符' 的表达式
// \\w可以处理英文与数字两种 碰到其他的字符就会作为一个结束点进行处理,匹配字母或数字或下划线或汉字
. 可以匹配除换行符以外的任意字符
\s 匹配任意的空白符
\d 匹配数字
\b 匹配单词的开始或结束
使用[]包含一系列字符,能够匹配其中任意一个字符。
[^]包含一系列字符,只能匹配其中字符外的任意一个字符,同样的道理,虽然可以匹配其中任意一个,但是只能是一个,不是多个。
[] 本身就隐含了“或”关系,在[]中使用“|”表示“或”的关系是不对的,这样做只是多了一个普通字符“|”,用来匹配“|”字符本身,()也是同样的道理
示例:
[ab5@] : 匹配 "a" 或 "b" 或 "5" 或 "@"
[^abc] : 匹配 "a","b","c" 之外的任意一个字符
[f-k] : 匹配 "f"~"k" 之间的任意一个字母
[^A-F0-3] : 匹配 "A"~"F","0"~"3" 之外的任意一个字符
修饰匹配次数的特殊符号
{n} : 表达式重复n次
{m,n} : 表达式至少重复m次,最多重复n次
{m,} : 表达式至少重复m次
? : 匹配表达式0次或者1次,相当于 {0,1}
+ : 表达式至少出现1次,相当于 {1,}
* : 表达式不出现或出现任意次,相当于 {0,}
其他一些代表抽象意义的特殊符号
^ : 与字符串开始的地方匹配,不匹配任何字符
$ : 与字符串结束的地方匹配,不匹配任何字符
\b : 匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符
() : 表示一个组,这个组是同时进行处理的,组中的元素会加在一起进行
*/
相关文章推荐
- iOS中的视图跳转的三种方式(代码跳转,根据桥跳转,按钮跳转)
- iOS 设置tableview动态高度
- 关于iOS和OS X废弃的API你需要知道的一切
- 关于iOS中的strong,weak,assign,copy,retain等关键字的总结
- iOS中的数据解析(XML,JSON),SAX解析,DOM解析
- iOS Xcode制作模板类
- iOS中的请求(GET请求,POST请求,同步请求,异步请求)
- iOS开发中常用的设计模式
- IOS开发—IOS绘制圆,直线,弧线,矩形,扇形,三角形,贝塞尔等图形
- 递归调用
- IOS绘图
- IOS断点续传
- iOS --- 在代码中使用NSLayoutConstraint添加AutoLayout的约束条件
- IOS程序之间的跳转
- iOS之OC随笔-九宫格的算法简单实现
- iOS地图开发
- 常用iOS第三方库以及XCode插件介绍
- IOS7实现扫描二维码
- iOS推送证书过期处理方法
- iOS-汉字排序