便利的使用正则表达式截取字段

 1 + (NSString *)getJpmobMobAdUrlField:(NSString *)key withJpmobUrl:(NSString *)string
 2 {
 3     NSError * error = nil;
 4     NSString * regTags = [[NSString alloc] initWithFormat:@"(^|&|\?)+%@=+([^&]*)(&|$)",key];
 5     NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:regTags
 6                                 options:NSRegularExpressionCaseInsensitive
 7                                    error:&error];
 8     // 执行匹配的过程
 9     NSArray *matches = [regex matchesInString:string
10                                                           options:0
11                                                             range:NSMakeRange(0, [string length])];
12     for (NSTextCheckingResult *match in matches)
13     {
14         NSString *tagValue = [string substringWithRange:[match rangeAtIndex:2]]; 
15         return tagValue;
16     }
17     return @"";
18 }

 1.对于正则式匹配器的初始化创建入口

    /**

     *  pattern是正则表达式

     *  options是参数

     *  error双指针

     */

+ (nullable NSRegularExpression *)regularExpressionWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;

- (nullable instancetype)initWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;

 具体参数枚举类型含义如下  

typedef NS_OPTIONS(NSUInteger, NSRegularExpressionOptions) 
{
   NSRegularExpressionCaseInsensitive             1 << 0//不区分字母大小写的模式
   NSRegularExpressionAllowCommentsAndWhitespace  = 1 << 1//忽略掉正则表达式中的空格和#号之后的字符
   NSRegularExpressionIgnoreMetacharacters        = 1 << 2//将正则表达式整体作为字符串处理
   NSRegularExpressionDotMatchesLineSeparators    = 1 << 3//允许.匹配任何字符,包括换行符  
   NSRegularExpressionAnchorsMatchLines           = 1 << 4//允许^和$符号匹配行的开头和结尾
   NSRegularExpressionUseUnixLineSeparators       = 1 << 5//设置
为唯一的行分隔符,否则所有的都有效。
   NSRegularExpressionUseUnicodeWordBoundaries    = 1 << 6 //使用Unicode TR#29标准作为词的边界,否则所有传统正则表达式的词边界都有效
};

实现字段匹配方法具体如下

- (NSArray<NSTextCheckingResult *> *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;

  参数options枚举类型含义为

typedef NS_OPTIONS(NSUInteger, NSMatchingFlags) 
{
   NSMatchingProgress               1 << 0//匹配到最长串是被设置     
   NSMatchingCompleted              = 1 << 1//全部分配完成后被设置    
   NSMatchingHitEnd                 = 1 << 2//匹配到设置范围的末尾时被设置   
   NSMatchingRequiredEnd            = 1 << 3//当前匹配到的字符串在匹配范围的末尾时被设置     
   NSMatchingInternalError          = 1 << 4  //由于错误导致的匹配失败时被设置   
};

最后匹配字段后的值,通过[match rangeAtIndex:2]得到该字段所在的range.字符截取得到所要的。输出结果如下

        /**
         *  原字串 wxOpenId=oJOMPs0XB_UH5sJaQ6VzRtpL3tMk&isWxFrom=0&isWxForm=0  59
         *  0     wxOpenId=oJOMPs0XB_UH5sJaQ6VzRtpL3tMk& {0,38}
         *  1     空                                     {0,0}
         *  2     oJOMPs0XB_UH5sJaQ6VzRtpL3tMk           {9,28}
         *  3     &                                      {37,1}
         */

  

原文地址:https://www.cnblogs.com/fuunnyy/p/5333507.html