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】

posted @ 2016-04-03 14:33  Kingdev  阅读(726)  评论(0编辑  收藏  举报