NSRegularExpression
相信大家开发过程中碰到这个问题:由于服务器端数据库不支持Emoji表情的插入,所以需要我们对于用户输入的内容过滤。
实现代码:
1 #pragma mark - UITextViewDelegate Methods 2 - (void)textViewDidChange:(UITextView *)textView { 3 if (textView.text.length) { 4 // 获取过滤之后的字符串 5 NSString *text = [self forbidInputEmoji:textView.text replaceWith:@""]; 6 // 若 textView.text != text;表明用户输入了Emoji表情,予以替换 7 if (![text isEqualToString:textView.text]) { 8 // 重新赋值 9 textView.text = text; 10 } 11 } 12 } 13 14 /** 15 * @brief 过滤字符串内'系统的Emoji表情' 16 * 17 * @param text 字符串内容 18 * @param template 指定替换成template 19 * 20 * @return 返回无表情字符串 21 */ 22 - (NSString *)forbidInputEmoji:(NSString *)text replaceWith:(NSString *)template { 23 NSString *pattern = @"[^\\u0020-\\u007E\\u00A0-\\u00BE\\u2E80-\\uA4CF\\uF900-\\uFAFF\\uFE30-\\uFE4F\\uFF00-\\uFFEF\\u0080-\\u009F\\u2000-\\u201f\r\n]"; 24 NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:nil]; 25 NSString *noEmoji = [regex stringByReplacingMatchesInString:text 26 options:0 27 range:NSMakeRange(0, [text length]) 28 withTemplate:template]; 29 return noEmoji; 30 }
NSRegularExpression是苹果自己的正则表达式类。
NSRegularExpression的使用:
参数: options
1 typedef NS_OPTIONS(NSUInteger, NSRegularExpressionOptions) { 2 NSRegularExpressionCaseInsensitive = 1 << 0, // 不区分大小写 3 NSRegularExpressionAllowCommentsAndWhitespace = 1 << 1, // 忽略 "空白" 和 "#" 前缀 4 NSRegularExpressionIgnoreMetacharacters = 1 << 2, // 将整个模式作为文字字符串 5 NSRegularExpressionDotMatchesLineSeparators = 1 << 3, // 允许的 "." 匹配任何字符,包括行分隔符 6 NSRegularExpressionAnchorsMatchLines = 1 << 4, // 允许 "^" 和" $" 匹配的开始和结束行 7 NSRegularExpressionUseUnixLineSeparators = 1 << 5, // 只允许 "\n" 作为换行符 8 NSRegularExpressionUseUnicodeWordBoundaries = 1 << 6 9 };
参数: options
1 typedef NS_OPTIONS(NSUInteger, NSMatchingOptions) { 2 NSMatchingReportProgress = 1 << 0, // block中使用 3 NSMatchingReportCompletion = 1 << 1, // block中使用 4 NSMatchingAnchored = 1 << 2, // block中使用 5 NSMatchingWithTransparentBounds = 1 << 3, // block中使用 6 NSMatchingWithoutAnchoringBounds = 1 << 4 // block中使用 7 };
1 ///============================================================================= 2 /// @name 头文件 : NSRegularExpression (NSMatching) 3 ///============================================================================= 4 5 /** 6 * @brief 获取第一个匹配的结果 7 * 8 * @param string 指定匹配的字符串 9 * @param options 指定匹配的样式 10 * @param range 指定匹配的范围,通常是指定字符串 NSRange range = NSMakeRange(0, string.length) 11 * 12 * @return 返回匹配结果 13 */ 14 - (nullable NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range; 15 16 /** 17 * @brief 遍历匹配结果(可以从中获取结果,做些处理) 18 * 19 * @param string 指定匹配的字符串 20 * @param options 指定匹配的样式(除了在block块中,通常设置为0) 21 * @param range 指定匹配的范围,通常是指定字符串 NSRange range = NSMakeRange(0, string.length) 22 * @param block block块,在block中我们可以这样操作: 23 if (flags != NSMatchingInternalError) { 24 // 获取匹配的结果的范围 25 NSRange range = result.range; 26 NSLog(@"range = %@", NSStringFromRange(range)); 27 // code... 28 } 29 */ 30 - (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range usingBlock:(void (^)(NSTextCheckingResult * __nullable result, NSMatchingFlags flags, BOOL *stop))block; 31 32 /** 33 * @brief 在字符串中提取我们想要匹配的所有数据 34 * 35 * @param string 指定字符串 36 * @param options 指定匹配的样式,通常设置为0 37 * @param range 指定匹配的范围,通常是指定字符串 NSRange range = NSMakeRange(0, string.length) 38 * 39 * @return 返回所有匹配结果的集合 40 */ 41 - (NSArray<NSTextCheckingResult *> *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range; 42 43 /** 44 * @brief 返回正确匹配的个数(技巧:验证邮箱、电话等,若结果为0,则不符合) 45 * 46 * @param string 指定字符串 47 * @param options 指定匹配的样式,此处设置为0 48 * @param range 指定匹配的范围,通常是指定字符串 NSRange range = NSMakeRange(0, string.length) 49 * 50 * @return 返回正确匹配的个数 51 */ 52 - (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range; 53 54 /** 55 * @brief 获取第一个匹配结果的范围 56 * 57 * @param string 指定字符串 58 * @param options 指定匹配的样式,此处设置为0 59 * @param range 指定匹配的范围,通常是指定字符串 NSRange range = NSMakeRange(0, string.length) 60 * 61 * @return 返回第一个匹配结果的范围 62 */ 63 - (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range; 64 65 66 67 68 69 ///============================================================================= 70 /// @name 头文件 : NSRegularExpression (NSReplacement) 71 ///============================================================================= 72 73 /** 74 * @brief 替换掉匹配出的字符串 75 * 76 * @param string 指定字符串 77 * @param options 指定匹配的样式,此处设置为0 78 * @param range 指定匹配的范围,通常是指定字符串 NSRange range = NSMakeRange(0, string.length) 79 * @param templ 指定替换的字符串 80 * 81 * @return 返回替换之后的字符串 82 */ 83 - (NSString *)stringByReplacingMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range withTemplate:(NSString *)templ;
以下给出示例代码:
#pragma mark - View lifeCycle - (void)viewDidLoad { [super viewDidLoad]; self.view.backgroundColor = [UIColor orangeColor]; // 过滤出字符串中的电话号码 NSString *testStr = @"阳光明媚的中午拿起了15690875639然后我的13867541266"; NSRange range = NSMakeRange(0, testStr.length); NSError *error; // 创建正则表达式类 NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:REGEX_PhoneNum options:NSRegularExpressionCaseInsensitive error:&error]; // 获取匹配的结果的个数 NSUInteger number = [regex numberOfMatchesInString:testStr options:0 range:range]; NSLog(@"number - %lu", number); // 获取过滤出的"符合条件的字符串"的数量,数组中存放的对象为:NSTextCheckingResult NSArray *tempArr = [regex matchesInString:testStr options:0 range:NSMakeRange(0, testStr.length)]; NSLog(@"tempArr - %ld", tempArr.count); // 遍历获取到"符合条件的字符串"的位置,你可以利用 NSMutableAttributedString 给他们予以处理等等 [regex enumerateMatchesInString:testStr options:0 range:range usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) { if (flags != NSMatchingInternalError) { NSRange range = result.range; NSLog(@"range = %@", NSStringFromRange(range)); // code... } }]; // 替换掉你要匹配的字符串 NSString *regexStr = [regex stringByReplacingMatchesInString:testStr options:0 range:range withTemplate:@"🇧🇱🇲🇶⚽︎"]; NSLog(@"reString = %@",regexStr); }
更详细内容可查看苹果官方文档。
尊重作者劳动成果,转载请注明: 【kingdev】