便利的使用正则表达式截取字段
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, //设置\n为唯一的行分隔符,否则所有的都有效。 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} */