你好,歡迎來到IOS教程網

 Ios教程網 >> IOS編程開發 >> IOS開發綜合 >> iOS_正則表達式

iOS_正則表達式

編輯:IOS開發綜合

iOS 正則表達式

正則表達式,又稱正規表示法、常規表示法(英語:Regular Expression,在代碼中常簡寫為regex、regexp或RE),計算機科學的一個概念。正則表達式使用單個字符串來描述、匹配一系列符合某個句法規則的字符串。在很多文本編輯器裡,正則表達式通常被用來檢索、替換那些符合某個模式的文本。

系統自帶的, 如: NSPredicate, rangeOfString:option, NSRegularExpression RegexKitLite RegexKitLite 是一個輕量級的 Objective-C 的正則表達式庫,支持 Mac OS X 和 iOS,使用 ICU 庫開發。

至於RegexKitLite, 這裡不做介紹。著重介紹系統自帶的那幾個辦法。

PS: 閱讀本文前提是您已經掌握了正則基本語法, 如果對正則還不太了解, 可以參考以下幾個鏈接:

正則表達式學習鏈接:

55分鐘學會正則表達式 揭開正則表達式的神秘面紗 RegExLib.com(正則表達式庫查詢)

1. NSPredicate

簡述:Cocoa框架中的NSPredicate用於查詢,原理和用法都類似於SQL中的where,作用相當於數據庫的過濾取。

NSPredicate *predicate = [NSPredicate predicateWithFormat:(NSString *), ...];

其中, 常見的Format有:

(1) 比較運算符: >, <, ==, >=, <=, !=

例:@"number > 100"

(2) 范圍運算符: IN, BETWEEN

例:@"number BETWEEN {1,5}"
   @"address IN {'shanghai','beijing'}"

(3) 字符串本身: SELF

例:@“SELF == ‘APPLE’"

(4) 字符串相關: BEGINSWITH, ENDSWITH, CONTAINS

例:@"name CONTAINS[cd] 'ang'"  //包含某個字符串
   @"name BEGINSWITH[c] 'sh'"  //以某個字符串開頭
   @"name ENDSWITH[d] 'ang'"   //以某個字符串結束

注:[c]不區分大小寫
   [d]不區分發音符號即沒有重音符號
   [cd]既不區分大小寫,也不區分發音符號。

(5) 通配符: LIKE

例:@"name LIKE[cd] '*er*'"    //*代表通配符,Like也接受[cd].
   @"name LIKE[cd] '???er*'"

(6) 正則表達式: MATCHES

例:NSString *regex = @"^A.+e$";   //以A開頭,e結尾
  @"name MATCHES %@",regex

至於如何使用呢? 下面舉幾個例子:

(a) 對NSArray進行過濾, 帥選出包含”ang”的項

    NSArray *array = [[NSArray alloc]initWithObjects:@"beijing", @"shanghai", @"guangzou", @"wuhan", nil];
    NSString *string = @"ang";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF CONTAINS %@", string];
    NSLog(@"%@", [array filteredArrayUsingPredicate:pred]);

//    打印結果:
//    (
//     shanghai,
//     guangzou
//    )

(b) 對NSDate進行篩選

    //日期在十天之內:
    NSDate *endDate = [NSDate date];
    NSTimeInterval timeInterval= [endDate timeIntervalSinceReferenceDate];
    timeInterval -=3600*24*10;
    NSDate *beginDate = [NSDate dateWithTimeIntervalSinceReferenceDate:timeInterval];
    //對coredata進行篩選(假設有fetchRequest)
    NSPredicate *predicate_date = [NSPredicate predicateWithFormat:@"date >= %@ AND date <= %@", beginDate,endDate];
    [fetchRequest setPredicate:predicate_date];

OK, NSPredicate的功能很多, 也很強大。這裡暫時就點到此, 感興趣的可以自己一一試驗。 下面舉兩個例子說明一下如何使用正則。

// 判斷是否是有效郵箱
- (BOOL)isValidateEmail:(NSString *)email{

    NSString *regex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    return [predicate evaluateWithObject:email];
}

// 判斷字符串首字母是否為字母
- (BOOL)isStartedWithWord:(NSString *)aString{

    NSString *regex = @"[A-Za-z]+";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    return [predicate evaluateWithObject:aString];
}

2. 利用rangeOfString:option:直接查找

    NSString *searchText = @"// Do any additional setup after loading the view, typically from a nib.";
    NSRange range = [searchText rangeOfString:@"(?:[^,])*\\." options:NSRegularExpressionSearch];
    if (range.location != NSNotFound) {
        NSLog(@"%@", [searchText substringWithRange:range]);
    }

//    打印結果:
//      typically from a nib.

options中設定NSRegularExpressionSearch就是表示利用正則表達式匹配,會返回第一個匹配結果的位置。


3. 使用正則表達式類

詳細了解: iOS 正則表達式 NSRegularExpression

上面那篇文章總結的很不錯. 這裡簡單再舉個例子:

    NSString *searchText = @"// Do any additional setup after loading the view, typically from a nib.";    
    NSError *error = NULL;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"(?:[^,])*\\." options:NSRegularExpressionCaseInsensitive error:&error];
    NSTextCheckingResult *result = [regex firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
    if (result) {
        NSLog(@"%@\n", [searchText substringWithRange:result.range]);
    }

//    打印結果:
//      typically from a nib.

使用系統的正則表達式類(NSRegularExpression)會返回匹配的多個結果。


針對以上3種方式, 做一個小小總結

第一種匹配需要學習NSPredicate的寫法,需要查閱蘋果相關技術文檔;

如果只關心第一個匹配的結果,第二種匹配較為簡潔;

如果需要匹配多個結果,同時匹配多次,第三種方式效率會更高。

常用正則表達式

參考: IOS常用正則表達式

表達式 作用 [\u4e00-\u9fa5] 匹配中文字符 [^\x00-\xff] 匹配雙字節字符(包括漢字在內) \n\s*\r 匹配空白行 <(\S*?)[^>]*>.*?|<.*? /> 匹配HTML標記 ^\s*|\s*$ 匹配首尾空白字符 \w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)* 匹配Email地 [a-zA-z]+://[^\s]* 匹配網址URL \d{3}-\d{8}|\d{4}-\d{7} 匹配國內電話號碼,匹配形式如 0511-4405222 或 021-87888822 [1-9]\d{5}(?!\d) 匹配中國郵政編碼 \d+.\d+.\d+.\d+ 匹配ip地址
  1. 上一頁:
  2. 下一頁:
蘋果刷機越獄教程| IOS教程問題解答| IOS技巧綜合| IOS7技巧| IOS8教程
Copyright © Ios教程網 All Rights Reserved