• (一一〇)正则表达式的基本使用与RegexKitLite的使用


    正则表达式常常用于匹配关键字,下面先介绍基本语法。

    【基本语法】

    ①中括号表示满足其中之一即可,例如[abc],则这个位置可以是a、b、c中任意一个。

    ②在中括号中,可以通过-连接范围,例如a-z;多个范围之间并列不需要任何分隔符,例如[a-zA-Z]

    ③表示重复次数用{x},例如[a-z]{2}表示连续2次;表示重复次数的范围可用{x,y}。

    ④\d表示数字。

    ⑤正则表达式默认的是贪婪匹配,例如[a-z]{2,4},如果出现类似abcde2ab这样的字符串,abcd满足最大长度4,因此会作为一个字符串、e是第二个、ab是第三个。

    ⑥通配符为.(点),.表示除换行符意外的任意字符。

    ⑦?表示0个或一个前面的字符、+代表至少一个、*代表0个或多个。

        例如zo*,*代表o可以是0个或者多个o,也就是说可以是z、zoo。

    ⑧以什么开头用^,以什么结尾用$。

    ⑨OC字符串中的特殊字符用转义。

        例如[ ]是正则中的特殊表达式,[是普通的'['字符,而OC中有特殊含义,需要对再转义,因此用\[表示'['。

    ⑩表示中文的范围为 \u4e00-\u9fa5。

    ⑪多个匹配条件的并列用|。

    匹配时一定要注意贪婪匹配的问题,否则可能会出错。


    下面介绍OC自带的正则表达式对象。

    【NSRegularExpression的使用】

    首先创建对象,然后通过匹配模式得到NSTextCheckingResult数组,从中取出对象可以拿到匹配到的字符的范围。

    下面的代码演示了从一个字符串中找出main和if的范围。

     NSString *code = @"mainjiaoififsiifnelsetifajomainiskkl";
     NSString *pattern1 = @"main|if";
     NSRegularExpression *regex = [[NSRegularExpression alloc] initWithPattern:pattern1 options:0 error:nil];
     NSArray *results = [regex matchesInString:code options:0 range:NSMakeRange(0, code.length)];       
     for (NSTextCheckingResult *result in results) {      
         NSLog(@"%@",NSStringFromRange(result.range));          
     }
    
    利用系统的对象进行匹配比较麻烦,下面介绍一个强大的第三方库RegexKitLite。


    【集成RegexKitLite】

    ①首先从github下载RegexKitLite

    ②将文件RegexKitLite.m和.h导入到工程。

    ③由于该库比较老,不支持ARC,因此应该为RegexKitLite.m添加编译标记-fno-objc-arc进行局部ARC禁止。

    ④添加动态库libicucore.dylib。

    注意③和④都在Build Phases中进行设置,如下图所示:

    通过以上几步就完成了集成,下面介绍该库的常用方法。

    该库是NSString的分类,因此字符串可以直接调用方法,常用的方法有匹配和分割。

    ①匹配:传入匹配模式pattern即可,可以获取匹配到的字符串和范围。

    [str enumerateStringsMatchedByRegex:pattern usingBlock:^(NSInteger captureCount, NSString *const __unsafe_unretained *capturedStrings, const NSRange *capturedRanges, volatile BOOL *const stop) {
               
         NSRange range = *capturedRanges;
         NSLog(@"%@ %@",*capturedStrings,NSStringFromRange(range));
                
    }];

    ②分割:有时候有一种需求,需要获取到所有匹配到的内容之外的字串,也就是利用正则内容分割字符串,可以得到匹配到的字串以外的字符串和范围。

    [str enumerateStringsSeparatedByRegex:pattern usingBlock:^(NSInteger captureCount, NSString *const __unsafe_unretained *capturedStrings, const NSRange *capturedRanges, volatile BOOL *const stop) {
           
         NSRange range = *capturedRanges;
         NSLog(@"%@ %@",*capturedStrings,NSStringFromRange(range));
            
    }];

  • 相关阅读:
    结构体位域与规范定义顺序的问题
    visual studio 2015使用MFC的console调试打印
    MFC笔记
    MFC中解决文本保存到文件时乱码问题
    C/C++关于文件的读写操作以及文件的打开和保存
    MFC使用自定义消息
    MFC输入框CEdit控件十六进制转换
    Visual studio C++ MFC应用程序自动探测串口号
    visual C++ MFC串口编程overlapped结构汇总
    模块及模块间的接口方式
  • 原文地址:https://www.cnblogs.com/aiwz/p/6154075.html
Copyright © 2020-2023  润新知