OC中的正則表達

OC正則表達式

  • NSString 簡單的字符串查找、替換;
  • NSRegularExpression 復雜的文本匹配、替換;
  • NSPredicate 復雜文本、對象等數(shù)據(jù)檢索, 有點像一個支持正則的SQL語句.

NSString

NSString *str2 = @"jjjjUUUUU@baidu.com";
    //以英文字母開頭
    /*
     options:
     NSRegularExpressionSearch 適用于rangeOfString:…stringByReplacingOccurrencesOfString:……,replaceOccurrencesOfString:……方法;搜索字符串被視為一個icu兼容的正則表達式;如果設置了,除了NSCaseInsensitiveSearch和NSAnchoredSearch,其他選項都不能應用
    
     NSAnchoredSearch 搜索被限制為源字符串的開始(或結(jié)束,如果NSBackwardsSearch)
     
     NSCaseInsensitiveSearch 忽略大小寫
     
     locale:
     要執(zhí)行用戶級字符串搜索,指定locale:[NSLocale currentLocale],或者更好的方法是使用localizedStandardRangeOfString:或localizedStandardContainsString:。
     
     */
    NSRange range1 = [str2 rangeOfString:@"[a-z]"
                                 options:NSRegularExpressionSearch | NSAnchoredSearch | NSCaseInsensitiveSearch
                                   range:NSMakeRange(0, str2.length)
                                  locale:[NSLocale currentLocale]];
    
    
    NSString *subString = [str2 substringWithRange:range1];
        //文字替換
    NSString *newString = [str2 stringByReplacingCharactersInRange:range1 withString:@"aaa"];
    NSLog(@"截獲的字符%@",subString); //截獲的字符j
    NSLog(@"替換后的字符%@",newString);//替換后的字符aaajjjUUUUU@baidu.com

NSRegularExpression

NSRegularExpression是一個用來表示和應用正則表達式的類。此類的實例是已編譯正則表達式模式和各種選項標志的不可變表示。

 NSString *str = @"clc_cfzxyq@163.com wcowfjwogjwoiejfiow 12321@qq.com 298349845fwe ctftf iLoveiOS@qq.com";
    
    NSString *pattern = @"\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
    /*
     
     options:
     
     NSRegularExpressionCaseInsensitive             = 1 << 0,     匹配模式中與大小寫無關(guān)的字母
    NSRegularExpressionAllowCommentsAndWhitespace  = 1 << 1,     忽略模式中的空格和帶#前綴的注釋。
    NSRegularExpressionIgnoreMetacharacters        = 1 << 2,     將整個模式視為文字字符串。
    NSRegularExpressionDotMatchesLineSeparators    = 1 << 3,     允許的。匹配任何字符,包括行分隔符。
    NSRegularExpressionAnchorsMatchLines           = 1 << 4,     允許^和$匹配行開始和結(jié)束。
    NSRegularExpressionUseUnixLineSeparators       = 1 << 5,     只將\n作為行分隔符(否則,將使用所有標準行分隔符
    NSRegularExpressionUseUnicodeWordBoundaries    = 1 << 6      使用Unicode TR#29來指定單詞邊界(否則,將使用傳統(tǒng)的正則表達式單詞邊界)
     */
    NSRegularExpression *regular = [[NSRegularExpression alloc] initWithPattern:pattern
                                                                        options:(NSRegularExpressionCaseInsensitive)
                                                                          error:nil];
    
    //1.返回匹配的數(shù)組 數(shù)組中是NSTextCheckingResult類型
    /*
     options:
     
     NSMatchingReportProgress         = 1 << 0,      在長時間運行的匹配操作期間定期調(diào)用該塊。
    NSMatchingReportCompletion       = 1 << 1,       在完成任何匹配之后調(diào)用該塊一次
    NSMatchingAnchored               = 1 << 2,       將匹配限制在搜索范圍的開始處
    NSMatchingWithTransparentBounds  = 1 << 3,       允許匹配超出搜索范圍的范圍
    NSMatchingWithoutAnchoringBounds = 1 << 4        阻止^和$自動匹配搜索范圍的開始和結(jié)束
     
     */
    NSArray *arry = [regular matchesInString:str
                                     options:0
                                       range:NSMakeRange(0, str.length)
                     ];
    
    /*2.默認情況下,塊迭代器方法為每個匹配精確地調(diào)用塊一次,使用非nil結(jié)果和適當?shù)臉酥尽H缓?,客戶端可以通過將stop的內(nèi)容設置為YES來停止操作。如果指定了NSMatchingReportProgress選項,那么在長時間運行的匹配操作期間也將定期調(diào)用該塊,標志中將設置nil結(jié)果和NSMatchingProgress,此時客戶端可以通過將stop的內(nèi)容設置為YES再次停止操作。如果指定了NSMatchingReportCompletion選項,那么在匹配完成后,塊將被調(diào)用一次,在標記中設置nil結(jié)果和NSMatchingCompleted,以及來自NSMatchingHitEnd、NSMatchingRequiredEnd或NSMatchingInternalError之間的任何附加相關(guān)標記。NSMatchingReportProgress和NSMatchingReportCompletion對塊迭代器以外的方法沒有影響。
    
    如果當前匹配操作到達搜索范圍的末端,則在傳遞給塊的標志中設置NSMatchingHitEnd。如果當前匹配取決于搜索范圍結(jié)束的位置,則在傳遞給塊的標志中設置NSMatchingRequiredEnd。NSMatchingInternalError是在沒有檢查整個搜索范圍的情況下,由于內(nèi)部錯誤(例如需要指數(shù)內(nèi)存分配的表達式)導致匹配失敗而傳遞給塊的標志中設置的。
    
    nsmatchinglocked, NSMatchingWithTransparentBounds, NSMatchingWithoutAnchoringBounds可以應用于任何匹配或替換方法。如果指定了nsmatchinganchor,那么匹配將被限制在搜索范圍的開始部分。如果指定了NSMatchingWithTransparentBounds,那么匹配可以檢查超出搜索范圍界限的部分字符串,以達到諸如單詞邊界檢測、向前查找等目的。如果指定了NSMatchingWithoutAnchoringBounds, ^和$將不會自動匹配搜索范圍的開始和結(jié)束(但仍然會匹配整個字符串的開始和結(jié)束)。如果搜索范圍覆蓋了整個字符串,則nsmatchingwithtransparency bounds和NSMatchingWithoutAnchoringBounds將不起作用。
    
    NSRegularExpression被設計成不可變的、線程安全的,這樣一個實例就可以同時用于匹配多個線程上的操作。但是,在匹配操作的過程中(無論是從另一個線程還是從迭代中使用的塊中),它所操作的字符串不應該發(fā)生變化。
     */
    
    [regular enumerateMatchesInString:str
                              options:0
                                range:NSMakeRange(0, str.length)
                           usingBlock:^(NSTextCheckingResult * _Nullable result, NSMatchingFlags flags, BOOL * _Nonnull stop) {
        
    }];
    
    //3.匹配總數(shù)
    NSInteger jj = [regular numberOfMatchesInString:str
                                            options:0
                                              range:NSMakeRange(0, str.length)];
    
    
    //解析匹配的結(jié)果
    NSMutableArray *muarry = [[NSMutableArray alloc] init];
    
    if (arry.count>0) {
        
        for (NSTextCheckingResult *result in arry) {
            
            NSRange range = result.range;
            [muarry addObject:[str substringWithRange:range]];
        }
    }
    
    NSLog(@"%@",muarry);//"clc_cfzxyq@163.com","12321@qq.com","iLoveiOS@qq.com"
    
    //匹配第一個數(shù)據(jù)
   NSRange firstRange = [regular rangeOfFirstMatchInString:str
                                                   options:0
                                                     range:NSMakeRange(0, str.length)];
    
    
    
    //替換(返回替換后的新字符串, 源字符串不變)
    NSString *newStr = [regular stringByReplacingMatchesInString:str options:0 range:firstRange withTemplate:@"哈哈"];
    NSLog(@"%@",newStr);//哈哈 wcowfjwogjwoiejfiow 12321@qq.com 298349845fwe ctftf:iLoveiOS@qq.com
    
    //對原數(shù)據(jù)的修改
    NSMutableString *muStr = [NSMutableString stringWithString:str];
    NSLog(@"%@",muStr);//clc_cfzxyq@163.com wcowfjwogjwoiejfiow 12321@qq.com 298349845fwe ctftf:iLoveiOS@qq.com
    NSInteger k= [regular replaceMatchesInString:muStr options:0 range:firstRange withTemplate:@"呵呵"];
    NSLog(@"%ld----%@",k,muStr);//1----呵呵 wcowfjwogjwoiejfiow 12321@qq.com 298349845fwe ctftf:iLoveiOS@qq.com
    

    
    //自定義替換
    NSMutableString *muStr1 = [str mutableCopy];
    NSInteger offset = 0;
    for (NSTextCheckingResult *result in arry) {
        
        NSRange resultRange = result.range;
       
        resultRange.location +=offset;
        
        NSString *newStr1 = [regular replacementStringForResult:result
                                                       inString:muStr1
                                                         offset:offset
                                                       template:@"$0"];
        
        NSString* replacement=nil;
        if ([newStr1 isEqualToString:@"clc_cfzxyq@163.com"]) {
            replacement = @"ONE";
        } else if ([newStr1 isEqualToString:@"12321@qq.com"]) {
            replacement = @"TWO";
        } else if ([newStr1 isEqualToString:@"iLoveiOS@qq.com"]) {
            replacement = @"THREE";
        }
        
        [muStr1 replaceCharactersInRange:resultRange withString:replacement];
       
        offset += ([replacement length] - resultRange.length);
       
        
    };
    
    NSLog(@"%@",muStr1);//ONE wcowfjwogjwoiejfiow TWO 298349845fwe ctftf THREE

NSPredicate

NSString *email = @"Yxwl_zsab1@126.com";
    NSString *regex = @"\\w+@\\w+\\.[a-zA-Z0-9]{2,4}";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    BOOL isValid = [predicate evaluateWithObject:email];
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容