zoukankan      html  css  js  c++  java
  • iOS:使用NSRegularExpression正则去掉一串字符串中所有的特殊字符和标点

    一、介绍

    在开发中,有时我们需要对一串字符串做特殊的处理后再使用,例如判断是不是特殊字符、去掉所有的特殊字符等。做处理的方法有很多,最简单的就是for循环遍历一个个的比较处理,最好用的应该是使用正则表达式。

     

    二、正则

      

    三、API

    NSRegularExpression匹配:

    /* 
     遍历的模式,正则表达式匹配在指定options和range模式下匹配指定string,传入block中可以获取结果信息
    */
    - (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range usingBlock:(void (NS_NOESCAPE ^)(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL *stop))block;
    
    
    /*
     在指定options和range模式下匹配指定string,通过正则匹配返回一个匹配结果的数组
    */
    - (NSArray<NSTextCheckingResult *> *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
    
    
    /*
      返回满足条件的匹配次数
    */
    - (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
    
    
    /*
     匹配返回的第一个结果,NSTextCheckingResult类型
    */
    - (nullable NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;
    
    
    /*
     匹配返回的第一个结果的NSRange范围信息
    */
    - (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range;

    相关的NSMatchingOptions 枚举和NSMatchingFlags 枚举 

    typedef NS_OPTIONS(NSUInteger, NSMatchingOptions) {
       NSMatchingReportProgress         = 1 << 0, //找到最长的匹配字符串后调用block回调
       NSMatchingReportCompletion       = 1 << 1, //找到任何一个匹配串后都回调一次block
       NSMatchingAnchored               = 1 << 2, //从匹配范围的开始处进行匹配
       NSMatchingWithTransparentBounds  = 1 << 3, //允许匹配的范围超出设置的范围
       NSMatchingWithoutAnchoringBounds = 1 << 4  //禁止^和$自动匹配行还是和结束
    };
    
    
    typedef NS_OPTIONS(NSUInteger, NSMatchingFlags) {
       NSMatchingProgress               = 1 << 0, //匹配到最长串后被设置     
       NSMatchingCompleted              = 1 << 1, //全部分配完成后被设置    
       NSMatchingHitEnd                 = 1 << 2, //匹配到设置范围的末尾时被设置   
       NSMatchingRequiredEnd            = 1 << 3, //当前匹配到的字符串在匹配范围的末尾时被设置     
       NSMatchingInternalError          = 1 << 4  //由于错误导致的匹配失败时被设置   
    };

    NSRegularExpression替换:

    /* 
     在指定的options和指定的range中,用新字段替换原文本中的对应字段,并返回操作后的NSString
    */
    - (NSString *)stringByReplacingMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range withTemplate:(NSString *)templ;
    
    
    /*
     用新字段替换原文本中的对应字段,并返回操作次数(替换字段的个数)
    */
    - (NSUInteger)replaceMatchesInString:(NSMutableString *)string options:(NSMatchingOptions)options range:(NSRange)range withTemplate:(NSString *)templ;
    
    
    /* 
     在 string 中查找由 result + offset 指定的字符串, 返回 template 指定的字符串(比如$0-9等)
    */
    - (NSString *)replacementStringForResult:(NSTextCheckingResult *)result inString:(NSString *)string offset:(NSInteger)offset template:(NSString *)templ;
    
    
    /* 
     正则表达式字符串, 包括一些特殊字符. 
    */
    + (NSString *)escapedTemplateForString:(NSString *)string;

    三、使用

    (1)去掉所有的特殊字符和标点符号

    +(NSString *)deleteCharacters:(NSString *)targetString{
        
        if (targetString.length==0 || !targetString) {
            return nil;
        }
        
        NSError *error = nil;
        NSString *pattern = @"[^a-zA-Z0-9u4e00-u9fa5]";//正则取反
        NSRegularExpression *regularExpress = [NSRegularExpression regularExpressionWithPattern:pattern options:NSRegularExpressionCaseInsensitive error:&error];//这个正则可以去掉所有特殊字符和标点
        NSString *string = [regularExpress stringByReplacingMatchesInString:targetString options:0 range:NSMakeRange(0, [targetString length]) withTemplate:@""];
        
        return string;
    }

    (2)判断是否是特殊字符或者标点符号 

    +(BOOL)isCharacters:(NSString *)targetString{
        
        NSString *regex = @"[u4e00-u9fa5|0-9|a-zA-Z]";
        NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
        return ![pred evaluateWithObject:targetString];
    }
  • 相关阅读:
    开启Nginx代理HTTPS功能
    Linux查找运行程序主目录
    Linux命令记录
    Eclipse 安装 阿里P3C编码规范插件
    Elasticsearch(ES)(版本7.x)数据更新后刷新策略RefreshPolicy
    JS小技巧
    改变窗口或屏幕大小时调用function
    毛玻璃效果 | fifter
    position: sticky;不一样失效原因
    mysql 修改密码问题 5.6,5.7 (配置方式的skip-grant-tables可能不行,推荐命令行方式)
  • 原文地址:https://www.cnblogs.com/XYQ-208910/p/8385088.html
Copyright © 2011-2022 走看看