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】

时间: 2024-08-29 14:00:28

NSRegularExpression的相关文章

iOS 中文字符判断 正则NSRegularExpression 谓词NSPredicate 和 NSRange

废话不说,直接上代码 #pragma mark - 中文字符判断 - (BOOL)validateContainsChinese:(NSString *)content { NSRegularExpression *regularexpression = [[NSRegularExpression alloc] initWithPattern:@"^[\u4e00-\u9fa5]" options:NSRegularExpressionCaseInsensitive error:nil

[iOS]利用系统NSRegularExpression使用正则表达式

// Created by 李东旭 on 16/1/22. // Copyright © 2016年 李东旭. All rights reserved. // #import <UIKit/UIKit.h> #import "ViewController.h" @interface ViewController () @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad];

iOS中的过滤器和正则表达式(NSPredicate,NSRegularExpression)

参考链接:http://www.cocoachina.com/industry/20140321/8024.html NSPredicate Cocoa提供了一个NSPredicate类,它用来指定过滤器的条件 初始化方法 + (NSPredicate *)predicateWithFormat:(NSString *)predicateFormat, ...; Format: /** 1.格式说明符 %d和%@等插入数值和字符串,%K表示key 还可以引入变量名,用$,类似环境变量,如:@"n

swift的正则表达式(NSRegularExpression)

swift的正则表达式(NSRegularExpression) by 伍雪颖 import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let mailPattern = "^([a-z0-9_\\.-]+)@([\\da-z\\.-]+)\\.([a-z\\.]{2,6})$" let matcher = RegexHelper(ma

iOS之— NSRegularExpression正则分割字符串

社交化越来为社会所接受,在做社会化产品时,在回复或者转发时会@他人 展示出来,点击@user 跳转到该用户的介绍页面,这里首先要制定恰当的标签,比如:<at href=\"jecky://profile/239\">iJecky</at>,然后客户端拿到文本时,要用到NSRegularExpression分割string,下面以富文本OHAttributedLabel来演示: 说明:本文中用到的contentLabel为OHAttributedLabel类型 示

iphone 正则表达式使用(NSRegularExpression)

原文: http://blog.csdn.net/l_ch_g/article/details/9399363 iphone 4.0以后就开始支持正则表达式的使用了,在ios4.0中正则表达式的使用是使用NSRegularExpression类来调用. 下面一个简单的使用正则表达式的一个例子: 1.首先新建一个项目,因为必须使用iso4.0以后的版本,所有我们新建一个iphone项目 File->new Project 选择:view-based Application 点击 choose. 填

iOS正则表达式NSRegularExpression

有时候我们可能想从网页上自己想要的数据摘取下来,此时一般我们可以使用正则表达式(NSRegularExpression).扫描器(NSScanner)两种途径解析. 在使用正则表达式的时候,如果需要解析HTML网页源码,使用NSRegularExpression的matchesInString方法解析可能只会返回一个结果,这是由于遇到换行符所导致,此时只需将.替换成[\\s\\S],小括号的意思是取出中间括号内匹配到的部分,其NSRange值将会在结果中返回.返回的result(NSTextCh

NSRegularExpression iOS自带的正则表达式

以前做验证邮箱,电话号码的时候通常用第三方的正则表达式或者NSPredicate(点这里查看以前的文章),在后期,苹果推出了自己的正则表达式来提供给开发者调用,很方便,功能也强大. 具体可以查看官方文档,包括如何书写进行匹配的正则表达式例子,这里我就不多加详述了,因为本人看那一堆符号好烦.....只好直接求助于谷歌了,下面只给出几个常用的. #define KPhoneRegex @"\\d{3}-\\d{8}|\\d{3}-\\d{7}|\\d{4}-\\d{8}|\\d{4}-\\d{7}|

iOS 中的正则匹配(工具类)

正则表达式 正则表达式是对字符串操作的一种逻辑公式, 用事先定义好的一些特定字符.及这些特定字符的组合, 组成一个"规则字符串", 这个"规则字符串"用来表达对字符串的一种过滤逻辑, 正则表达式就是用于描述这些规则的工具, 或者说, 正则表达式就是记录文本规则的代码. 在开发中, 我们经常会有查找符合某些复杂规则的字符串的需要, 比如数据校验: 判断用户的输入是否合法(如:用户注册的时候,QQ号码,电话号码,邮箱是否符合要求) 下面让我们先来看看正则匹配常用的一些字