目标:解出以下题目:
在我们使用的微博中是可以去@别人的,那么在我们使用的时候就需要去处理一些字符串了。具体要求如下:
开始为一个以字母或是数字开始然后添加@符号,中间不论是什么东西,也可以有反斜杠,不过有反斜杠的字母都作为本身处理,以空格或是最终行结尾结束。如果空格前有反斜杠则不作为空格处理,直接向下进行搜索直至找到所需要的空格为止
代码解析用到知识点:
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
输入的字符串,在使用的时候会自动进行转义,如果输入的是一个反斜杠,在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 : 匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符
() : 表示一个组,这个组是同时进行处理的,组中的元素会加在一起进行
*/