您的位置:首页 > 移动开发 > IOS开发

iOS正则表达式使用

2015-09-13 21:31 495 查看
目标:解出以下题目:

在我们使用的微博中是可以去@别人的,那么在我们使用的时候就需要去处理一些字符串了。具体要求如下:

开始为一个以字母或是数字开始然后添加@符号,中间不论是什么东西,也可以有反斜杠,不过有反斜杠的字母都作为本身处理,以空格或是最终行结尾结束。如果空格前有反斜杠则不作为空格处理,直接向下进行搜索直至找到所需要的空格为止

代码解析用到知识点:

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 : 匹配一个单词边界,也就是单词和空格之间的位置,不匹配任何字符



() : 表示一个组,这个组是同时进行处理的,组中的元素会加在一起进行

*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: