正则表达式复习总结

项目代码:
更多语法参考正则百科

图文混排参考

NSDataDetector

  • 系统自带的 正则表达式的子类,实现了一些常用的正则封装,比如:判断 url 很方便.

正则表达式常用符号含义:


一.单个字符匹配

  • [] 表示匹配其中任意一个字符,如:[abc123] 表示必须是abc123其中任意一个,又如: [a-z0-9] 匹配小写字母和数字。

  • [^]表示匹配不是其中任意一个字符,如:[^abc123] 表示必须不是abc123其中任意一个,又如,[^a-z0-9]表示必须不是小写字母和数字其中任意一个。

  • \d 表示匹配所有的数字 相当于[0-9]

  • . 表示匹配除换行符号以外的任意字符

  • \w 表示匹配字母 或 数字 或 下划线 或 汉字

  • \s 表示匹配任意的空白符


二. 多个字符匹配

  • {n} 表示{}前的字符(字符表达式)必须出现n次, 如: [0-9][a-z]{3} 表示数字后面必须有3个字母,比如:1abc。

  • {n,m}表示{}前的字符(字符表达式)必须出现最少n次最多m次,如: [0-9][a-z]{3,6} 表示数字后面必须有3到6个字母。

  • {n,} 表示{}前的字符(字符表达式)必须出现最少n次, 如:[0-9][a-z]{3,}表示数字后面至少3个字母。

  • * 表示*前面的字符(字符表达式)可以重复出现0次或更多次,如: [a-z][0-9]* 表示字母后面可以有多个数字或者没有数字

  • + 表示+前面的字符(字符表达式)可以重复出现1次或更多次

  • ? 表示?前面的字符(字符表达式)可以重复出现0次或1次



三.位置匹配表示

  • ^ 表示匹配必须以什么开始,如: ^[a-z] 表示必须以小写字母开始。
  • $ 表示匹配必须以什么结尾, 如:[123][asd]$ 表示必须以asd其中任意一个字符结尾



二、正则匹配字符串位置的使用

  • 1.siwft 方式

    func myReg() {
        //1. 待匹配的字符串
        let rawStr = "abcaaaaabc"
        
        //2. 正则匹配的样式
        let pattern = "abc" 
       
      //3.创建正则表达式
        guard let regex =  try? NSRegularExpression(pattern: pattern, options: []) else {
            print("创建正则表达式失败")
            return
        }

        //4. 使用正则表达式匹配字符串
        let resultArr  =  regex.matches(in: rawStr, options: [], range: NSRange(location: 0, length: (rawStr as NSString).length))
        
        //4. 获取匹配出的结果
        for result in resultArr {
            let resultStr = (rawStr as NSString).substring(with: result.range)
            print("匹配结果字符串:\(resultStr),匹配结果字符串范围: \(result.range)")
        }
        
        if resultArr.count == 0{
            print("匹配失败")
        }
        
    }
    
  • 2.oc 方式
@interface NSString (EmojiRegex)

/** 给定字符串和正则表达式,匹配出所有满足条件的字符串
 返回值: 满足 正则表达式样式的 subString 的NSArray
 参数:regPattern 正则表达式的样式
 */
-(NSArray *)subStringArrWithPattern:(NSString *)regPattern;

/** 给定字符串和正则表达式,匹配出所有满足条件的字符串的位置字符串
 返回值: 满足 正则表达式样式的 subString 的NSRange
 参数:regPattern 正则表达式的样式
 */
-(NSArray *)subStringRangeArrWithPattern:(NSString *)regPattern;
    
@end



@implementation NSString (EmojiRegex)


/** 给定字符串和正则表达式,匹配出所有满足条件的字符串
 返回值: 满足 正则表达式样式的 subString 的NSArray
 参数:regPattern 正则表达式的样式
 */
-(NSArray *)subStringArrWithPattern:(NSString *)regPattern{
    
    NSArray *rangeStrArr = [self subStringRangeArrWithPattern:regPattern];;

    NSMutableArray *patternStrArrM = [NSMutableArray array];
    for (NSString *rangeStr in rangeStrArr) {
        NSRange range = NSRangeFromString(rangeStr);
        NSString *str = [self substringWithRange:range];
        [patternStrArrM addObject:str];
    }


    return patternStrArrM;
}

/** 给定字符串和正则表达式,匹配出所有满足条件的字符串的位置字符串
 返回值: 满足 正则表达式样式的 subString 的NSRange
 参数:regPattern 正则表达式的样式
 */
-(NSArray *)subStringRangeArrWithPattern:(NSString *)regPattern{
    
    NSError *err = nil;
    NSRegularExpression *regExp = [[NSRegularExpression alloc]initWithPattern:regPattern options:kNilOptions error:&err];
    
    if (err != nil) {
        NSLog(@"创建正则表达式失败");
        return nil;
    }
    
    
    NSArray *resultArr= [regExp matchesInString:self options:kNilOptions range:NSMakeRange(0, self.length)];
    
    NSMutableArray *rangeStrArrM = [NSMutableArray array];
    for (NSTextCheckingResult *result in resultArr) {
        NSRange range = [result range];
        [rangeStrArrM addObject:NSStringFromRange(range)];
        
    }
    return rangeStrArrM;
}
@end

三、正则表达式实践

  • 匹配 URL
// 匹配网址:
    NSString *rawStr = @"点击参考网址:http://www.baidu.com 查看详情http://www.baidu.com2";
    NSString *pattern = @"http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?";
 
    NSArray *subStrArr = [rawStr subStringArrWithPattern:pattern];
   
    if (subStrArr.count > 0) {
        NSLog(@"匹配结果如下:");
    
        for (NSString *subStr in subStrArr) {
            NSLog(@"%@",subStr);
        }
    }
    else{
        NSLog(@"-------匹配 失败了--------");
    }

结果:

http://www.baidu.com 
http://www.baidu.com2
  • 匹配出
    开始是某个确定的字符
    结尾是某个确定字符
    中间是具体的某种表达式(中间不能有开始和结尾的字符),
    比如,以#开始 以#结尾 中间是URL网址
    NSString *rawStr = @"点击参考网址:#http://www.baidu.com#查看详情#http://www.baidu.com2# #http://www.baidu.com#";
    NSString *pattern = @"#http(s)?://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?#";
 
    NSArray *subStrArr = [rawStr subStringArrWithPattern:pattern];
   
    if (subStrArr.count > 0) {
        NSLog(@"匹配结果如下:");
    
        for (NSString *subStr in subStrArr) {
            NSLog(@"%@",subStr);
        }
    }
    else{
        NSLog(@"-------匹配 失败了--------");
    }

结果:

#http://www.baidu.com#
#http://www.baidu.com2#
#http://www.baidu.com#
  • 匹配表情
    分析,表情一般都是 以[开始 中间是文字 后面是 ]结尾
 /** 表情  [吃惊] [好爱哦]

     */
    NSString *rawStr = @"@zhangsan:【成都新闻】 #春熙路#宁夏街[偷笑],@张老五:老西门,城东们[吃惊]@西门吹雪:皮读取#碧波园#白桥[好爱哦]~~~http://baidu.com.news";
    NSString *pattern = @"\\[.*?\\]";
 
    
    NSArray *subStrArr = [rawStr subStringArrWithPattern:pattern];
   
    if (subStrArr.count > 0) {
        NSLog(@"匹配结果如下:");
    
        for (NSString *subStr in subStrArr) {
            NSLog(@"%@",subStr);
        }
    }
    else{
        NSLog(@"-------匹配 失败了--------");
    }

结果:

 [偷笑]
 [吃惊]
[好爱哦]
  • 匹配表情位置
    分析,表情一般都是 以[开始 中间是文字 后面是 ]结尾
/** 表情  [吃惊] [好爱哦]
     */
    NSString *rawStr = @"@zhangsan:【成都新闻】 #春熙路#宁夏街[偷笑],@张老五:老西门,城东们[吃惊]@西门吹雪:皮读取#碧波园#白桥[好爱哦]~~~http://baidu.com.news";
    NSString *pattern = @"\\[.*?\\]";
 
    NSArray *rangArr = [rawStr subStringRangeArrWithPattern:pattern];
    
    if (rangArr.count > 0) {
        for (NSString *rangStr in rangArr) {
            NSLog(@"rangStr:%@",rangStr);
        }
    }
    else{
        NSLog(@"---rangArr----匹配 失败了--------");
    }

结果:

rangStr:{25, 4}
rangStr:{42, 4}
rangStr:{62, 5}

你可能感兴趣的:(正则表达式复习总结)