編碼篇 - 正則表達式及其相關(guān)

前言

有時我們需要在一大段長文本中過濾出我們需要的字段铁瞒,或者檢驗該文本是否符合要求(該文本是否是郵箱妙色,鏈接,電話號碼或身份證)慧耍,這時候就需要用到正則表達式了身辨,當然我們也可以使用 NSPredicate,這不重要芍碧,重要的是表達式對于刷選和邏輯判斷來說是十分方便的煌珊。

文章脈絡(luò)

謂詞(NSPredicate)

Predicate(謂語)的意思。NSPredicate類是用來定義邏輯條件約束的獲取或內(nèi)存中的過濾搜索泌豆。原理和用法都類似于SQL中的where定庵,作用相當于數(shù)據(jù)庫的過濾取
NSPredicate真的是Cocoa的優(yōu)勢之一。其他語言的第三方庫根本沒法和他比。對于我們這些應(yīng)用和框架開發(fā)者來說蔬浙,有它作為標準組件使得我們在處理數(shù)據(jù)時有了很大的優(yōu)勢猪落。

NSPredicate語法:

  • 比較運算符

=、==:判斷兩個表達式是否相等畴博,在謂詞中=和==是相同的意思都是判斷笨忌,而沒有賦值這一說

  NSNumber *testNumber = @123;
  NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF = 123"];
  if ([predicate evaluateWithObject:testNumber]) {
   NSLog(@"testString:%@", testNumber);
  }
  我們可以看到輸出的內(nèi)容為:
   2016-01-07 11:12:27.281 PredicteDemo[4130:80412] testString:123

=,=>:判斷左邊表達式的值是否大于或等于右邊表達式的值
<=俱病,=<:判斷右邊表達式的值是否小于或等于右邊表達式的值
:判斷左邊表達式的值是否大于右邊表達式的值
<:判斷左邊表達式的值是否小于右邊表達式的值
!=官疲、<>:判斷兩個表達式是否不相等
BETWEEN:BETWEEN表達式必須滿足表達式 BETWEEN {下限,上限}的格式亮隙,要求該表達式必須大于或等于下限途凫,并小于或等于上限
NSNumber *testNumber = @123;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF BETWEEN {100, 200}"];
if ([predicate evaluateWithObject:testNumber]) {
NSLog(@"testString:%@", testNumber);
} else {
NSLog(@"不符合條件");

  }
  輸出結(jié)果為:
  2016-01-07 11:20:39.921 PredicteDemo[4366:85408] testString:123
  • 邏輯運算符

AND、&&:邏輯與溢吻,要求兩個表達式的值都為YES時颖榜,結(jié)果才為YES。
NSArray *testArray = @[@1, @2, @3, @4, @5, @6];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF > 2 && SELF < 5"];
NSArray *filterArray = [testArray filteredArrayUsingPredicate:predicate];
NSLog(@"filterArray:%@", filterArray);
輸出結(jié)果為:
2016-01-07 11:27:01.885 PredicteDemo[4531:89537] filterArray:(
3,
4
)
OR煤裙、||:邏輯或,要求其中一個表達式為YES時噪漾,結(jié)果就是YES
NOT硼砰、 !:邏輯非,對原有的表達式取反

  • 字符串比較運算符

BEGINSWITH:檢查某個字符串是否以指定的字符串開頭(如判斷字符串是否以a開頭:BEGINSWITH 'a')
ENDSWITH:檢查某個字符串是否以指定的字符串結(jié)尾
CONTAINS:檢查某個字符串是否包含指定的字符串
LIKE:檢查某個字符串是否匹配指定的字符串模板欣硼。其之后可以跟?代表一個字符和代表任意多個字符兩個通配符题翰。比如"name LIKE 'ac'",這表示name的值中包含ac則返回YES诈胜;"name LIKE '?ac'"豹障,表示name的第2、3個字符為ac時返回YES焦匈。

MATCHES:檢查某個字符串是否匹配指定的正則表達式血公。雖然正則表達式的執(zhí)行效率是最低的,但其功能是最強大的缓熟,也是我們最常用的累魔。所以NSPredicate也可以結(jié)合正則表達式語句來使用。

注:字符串比較都是區(qū)分大小寫和重音符號的够滑。如:café和cafe是不一樣的垦写,Cafe和cafe也是不一樣的。如果希望字符串比較運算不區(qū)分大小寫和重音符號彰触,請在這些運算符后使用[c]梯投,[d]選項。其中[c]是不區(qū)分大小寫,[d]是不區(qū)分重音符號分蓖,其寫在字符串比較運算符之后尔艇,比如:name LIKE[cd] 'cafe',那么不論name是cafe咆疗、Cafe還是café上面的表達式都會返回YES漓帚。

  • 集合運算符

ANY、SOME:集合中任意一個元素滿足條件午磁,就返回YES尝抖。
ALL:集合中所有元素都滿足條件,才返回YES迅皇。
NONE:集合中沒有任何元素滿足條件就返回YES昧辽。如:NONE person.age < 18,表示person集合中所有元素的age>=18時登颓,才返回YES搅荞。
IN:等價于SQL語句中的IN運算符,只有當左邊表達式或值出現(xiàn)在右邊的集合中才會返回YES框咙。我們通過一個例子來看一下
NSArray *filterArray = @[@"ab", @"abc"];
NSArray *array = @[@"a", @"ab", @"abc", @"abcd"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"NOT (SELF IN %@)", filterArray];
NSLog(@"%@", [array filteredArrayUsingPredicate:predicate]);
代碼的作用是將array中和filterArray中相同的元素去除咕痛,輸出為:
2016-01-07 13:17:43.669 PredicteDemo[6701:136206] (
a,
abcd
)
array[index]:返回array數(shù)組中index索引處的元素
array[FIRST]:返回array數(shù)組中第一個元素
array[LAST]:返回array數(shù)組中最后一個元素
array[SIZE]:返回array數(shù)組中元素的個數(shù)

  • 直接量

在謂詞表達式中可以使用如下直接量
FALSE倍权、NO:代表邏輯假
TRUE爱沟、YES:代表邏輯真
NULL、NIL:代表空值
SELF:代表正在被判斷的對象自身
"string"或'string':代表字符串
數(shù)組:和c中的寫法相同准潭,如:{'one', 'two', 'three'}者铜。
數(shù)值:包括證書腔丧、小數(shù)和科學(xué)計數(shù)法表示的形式
十六進制數(shù):0x開頭的數(shù)字
八進制:0o開頭的數(shù)字
二進制:0b開頭的數(shù)字

謂詞的用法

  • 構(gòu)造謂詞 使用正則表達式進行判斷
    evaluateWithObject:方法返回的是一個BOOL值,如果符合條件就返回YES作烟,不符合就返回NO愉粤。
    # 有人說 只有在正則表達式為^表達式$時使用謂詞才是準確的,而不是所有情況都使用拿撩。
    # 其他情況下會出現(xiàn)判斷錯誤的情況衣厘,未親測,有待研究

  • 使用謂詞過濾集合
    # 我想這應(yīng)該是 NSPredicate 最重要最強大的用處了绷雏,

          對于集合中的條件刷選头滔,我們一般使用 for循環(huán),新建容器涎显,
         if else 找出目標元素裝入新的容器中坤检。而 NSPredicate  可以使用簡潔的語句就實現(xiàn)如此繁瑣的操作,
          的確是省事了不少
    
       NSArray提供了如下方法使用謂詞來過濾集合
    - (NSArray*)filteredArrayUsingPredicate:(NSPredicate *)predicate:使用指定的謂詞過濾NSArray集合期吓,返回符合條件的元素組成的新集合
    
        NSMutableArray提供了如下方法使用謂詞來過濾集合
    - (void)filterUsingPredicate:(NSPredicate *)predicate:使用指定的謂詞過濾NSMutableArray早歇,剔除集合中不符合條件的元素
    
        NSSet提供了如下方法使用謂詞來過濾集合
     - (NSSet*)filteredSetUsingPredicate:(NSPredicate *)predicate NS_AVAILABLE(10_5, 3_0):作用同NSArray中的方法
    
        NSMutableSet提供了如下方法使用謂詞來過濾集合
    - (void)filterUsingPredicate:(NSPredicate *)predicate NS_AVAILABLE(10_5, 3_0):作用同NSMutableArray中的方法倾芝。
    
  • 在謂詞中使用占位符參數(shù)
    %K:用于動態(tài)傳入屬性名
    %@:用于動態(tài)設(shè)置屬性值
    詳細用法查看這里

常用 NSPredicate 實例

  • 正則判斷手機號碼地址格式
    # 手機運營商的號碼有可能添加新號段,所以這樣的驗證方式還是不穩(wěn)妥的

    - (BOOL)isMobileNumber:(NSString *)mobileNum
    {
      /**
       * 手機號碼
       * 移動:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
       * 聯(lián)通:130,131,132,152,155,156,185,186
       * 電信:133,1349,153,180,189
       */
      NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";
      /**
       10         * 中國移動:China Mobile
       11         * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
       12         */
      NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$";
      /**
       15         * 中國聯(lián)通:China Unicom
       16         * 130,131,132,152,155,156,185,186
       17         */
      NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";
      /**
       20         * 中國電信:China Telecom
       21         * 133,1349,153,180,189
       22         */
      NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$";
      /**
       25         * 大陸地區(qū)固話及小靈通
       26         * 區(qū)號:010,020,021,022,023,024,025,027,028,029
       27         * 號碼:七位或八位
       28         */
      // NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$";
      
      NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];
      NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];
      NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];
      NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];
      
      if (([regextestmobile evaluateWithObject:mobileNum] == YES)
          || ([regextestcm evaluateWithObject:mobileNum] == YES)
          || ([regextestct evaluateWithObject:mobileNum] == YES)
          || ([regextestcu evaluateWithObject:mobileNum] == YES))
      {
          if([regextestcm evaluateWithObject:mobileNum] == YES) {
              NSLog(@"China Mobile");
          } else if([regextestct evaluateWithObject:mobileNum] == YES) {
              NSLog(@"China Telecom");
          } else if ([regextestcu evaluateWithObject:mobileNum] == YES) {
              NSLog(@"China Unicom");
          } else {
              NSLog(@"Unknow");
          }
          
          return YES;
      }
      else
      {
          return NO;
      }
    }
     # 簡化版
     - (BOOL)checkPhoneNumber:(NSString *)phoneNumber
    {
      NSString *regex = @"^[1][3-8]\\d{9}$";
      NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
      return [pred evaluateWithObject:phoneNumber];
    }
    
  • 驗證email

    +(BOOL)isValidateEmail:(NSString *)email {
    
      NSString *strRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{1,5}";
       #或者這個NSString *regex = @"\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";
      NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", strRegex];
      return [predicate evaluateWithObject:email];  
    }
    
  • 驗證電話號碼
    +(BOOL)isValidateTelNumber:(NSString *)number {

      NSString *strRegex = @"[0-9]{1,20}";
      NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", strRegex];
      return [predicate evaluateWithObject:number];   
    }
    

NSRegularExpression 正則表達式

RegularExpression 的漢語意思就是正則表達式箭跳,所以 NSRegularExpression 才是iOS中的正則表達式晨另, 不熟悉的人會錯誤地以為NSPredicate 是正則表達式。下面介紹一下 NSRegularExpression


NSRegularExpression 位于 Foundation 框架中,主要作用相當與檢索條件判斷谱姓,但是其強大方便的功能是以晦澀的語法為犧牲的借尿。如果你想仔細研究的話,可以看這倆篇文章:語法列表& 入門教程
如果你看哭了屉来,不要找我路翻,/笑哭

正則表達式最主要的作用是查找刷選、或者替換茄靠,當然也可以用來做判斷茂契。numberOfMatchesInString 為0就是沒有一個匹配的目標,也就是 NO 慨绳。

NSRegularExpression 的相關(guān)方法

  # 初始化方法
  + (nullable NSRegularExpression *)regularExpressionWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error;
  - (nullable instancetype)initWithPattern:(NSString *)pattern options:(NSRegularExpressionOptions)options error:(NSError **)error NS_DESIGNATED_INITIALIZER;

  #  操作方法
   返回所有匹配結(jié)果的集合(適合,從一段字符串中提取我們想要匹配的所有數(shù)據(jù)) 
  - (NSArray<NSTextCheckingResult *> *)matchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range; 
   返回正確匹配的個數(shù)(通過等于0,來驗證郵箱,電話什么的,代替NSPredicate) 
  - (NSUInteger)numberOfMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range; 
   返回第一個匹配的結(jié)果掉冶。注意,匹配的結(jié)果保存在  NSTextCheckingResult 類型中 
   - (NSTextCheckingResult *)firstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range; 
    返回第一個正確匹配結(jié)果字符串的NSRange 
  - (NSRange)rangeOfFirstMatchInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range; 
    block方法 枚舉每個符合約定的字段脐雪,通過block對其進行操作 
 - (void)enumerateMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range usingBlock:(void (^)(NSTextCheckingResult *result, NSMatchingFlags flags, BOOL *stop))block; 
 */  


 # NSRegularExpression類中提供了方法來實現(xiàn)用新的字段來替換原文中符合規(guī)則的字段厌小。

   用新字段替換原文本中的對應(yīng)字段,并返回操作后的NSString
 - (NSString *)stringByReplacingMatchesInString:(NSString *)string options:(NSMatchingOptions)options range:(NSRange)range withTemplate:(NSString *)templ;
   用新字段替換原文本中的對應(yīng)字段战秋,并返回操作次數(shù)(替換字段的個數(shù))
 - (NSUInteger)replaceMatchesInString:(NSMutableString *)string options:(NSMatchingOptions)options range:(NSRange)range withTemplate:(NSString *)templ;
  

 # NSRegularExpressionOptions;

 NSRegularExpressionCaseInsensitive             = 1 << 0,   // 不區(qū)分大小寫的 
 NSRegularExpressionAllowCommentsAndWhitespace  = 1 << 1,   // 忽略空格和# - 
 NSRegularExpressionIgnoreMetacharacters        = 1 << 2,   // 整體化 
 NSRegularExpressionDotMatchesLineSeparators    = 1 << 3,   // 匹配任何字符召锈,包括行分隔符 
 NSRegularExpressionAnchorsMatchLines           = 1 << 4,   // 允許^和$在匹配的開始和結(jié)束行 
 NSRegularExpressionUseUnixLineSeparators       = 1 << 5,   // (查找范圍為整個的話無效) 
 NSRegularExpressionUseUnicodeWordBoundaries    = 1 << 6    // (查找范圍為整個的話無效) 
 }; 

 #  NSTextCheckingResult    這是一個文本搜索結(jié)果對象里面包含了 Range 屬性 和一個文本搜索類型  的屬性,
  我們只需要使用 Range 屬性 即可.
  [@"原文本" substringWithRange:range]] 即可獲取匹配到的內(nèi)容
Paste_Image.png

示例

# 測試字符串获询,把里面的電話號碼解析出來  
NSString *urlString = @"哈哈哈哈呵呵呵s15279107723在這里啊啊啊啊s15279107716";  
NSError *error = NULL;  
// 根據(jù)匹配條件,創(chuàng)建了一個正則表達式(類方法,實例方法類似)  
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"\\d{3}-\\d{8}|\\d{3}-\\d{7}|\\d{4}-\\d{8}|\\d{4}-\\d{7}|1+[358]+\\d{9}|\\d{8}|\\d{7}"   options:NSRegularExpressionCaseInsensitive error:&error];  
if (regex != nil) {  
    NSTextCheckingResult *firstMatch = [regex firstMatchInString:urlString  
                                                         options:0  
                                                        range:NSMakeRange(0, [urlString length])];  
    if (firstMatch) {  
        NSRange resultRange = [firstMatch rangeAtIndex:0];  
        //從urlString中截取數(shù)據(jù)  
        NSString *result = [urlString substringWithRange:resultRange];  
        NSLog(@"result = %@",result);  
    }  

    NSUInteger number = [regex numberOfMatchesInString:urlString  
                                               options:0  
                                               range:NSMakeRange(0, [urlString length])];  
    NSLog(@"number = %ld",number);  

    [regex enumerateMatchesInString:urlString options:0 range:NSMakeRange(0, [urlString length]) usingBlock:^(NSTextCheckingResult *result, NSMatchingFlags flags, BOOLBOOL *stop) {  
        NSLog(@"---%@",NSStringFromRange([result range]));  
        if (flags != NSMatchingInternalError) {  
            NSRange firstHalfRange = [result rangeAtIndex:0];  
            if (firstHalfRange.length > 0) {  
                NSString *resultString1 = [urlString substringWithRange:firstHalfRange];  
                NSLog(@"result1 = %@",resultString1);  
            }  
        }  
        *stop = YES;  
    }];  
}  

需要注意的地方

有些正則表達式 在轉(zhuǎn)化成字符串時就有出編譯警告,對元字符需要轉(zhuǎn)譯拐袜,比如下面這個驗證郵箱的正則表達式:

   \w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*
   NSString *regex = @"\\w+([-+.]\\w+)*@\\w+([-.]\\w+)*\\.\\w+([-.]\\w+)*";

常用正則表達式

(1)^和$屬于特殊符號吉嚣,前者表示匹配字符串的開頭,后者表示匹配字符串的結(jié)尾蹬铺。
(2)得出.符號表示任一字符(除換行符之外)尝哆。
(3)還有\(zhòng)d用來表示任意的單個數(shù)字,\w表示任意一個字母或數(shù)字或者直接使用0-9的任意數(shù)字表示具體數(shù)字甜攀。而特殊符號?表示前一個字符為0或者1個秋泄。
(4)表達式的字符分為兩類:值表達和修飾表達。所謂值表達就是說這個符號表示了某個值规阀,就像\d表示數(shù)字恒序,.表示任意非換行符字符。修飾表達用來修飾值達成某種條件谁撼,比如{2}表示前面一個值重復(fù)兩次歧胁,*表示前一個值重復(fù)0次或者更多次。
結(jié)合例子解釋正則表達式

單語法/字符說明表
值表達

語法 意義
. 匹配除換行符外的任意字符
\w 匹配字母或者數(shù)字的字符
\W 匹配任意不是字母或數(shù)字的字符
\s 匹配任意的空白符(空格、制表符喊巍、換行符)
\S 匹配任意不是空白符的字符
\d 匹配任意數(shù)字
\D 匹配任意非數(shù)字的字符
\b 匹配單詞的結(jié)尾或者開頭的字符
\B 匹配任意不是單詞結(jié)尾或開頭的字符
[^x] 匹配任意非x的字符屠缭。如[^[a-z]]匹配非小寫字母的任意字符
^ 匹配字符串的開頭
$ 匹配字符串的結(jié)尾

修飾表達

語法 意義
* 匹配重復(fù)任意次數(shù)
+ 匹配重復(fù)一次以上的次數(shù)
? 匹配一次或零次
{n} 匹配重復(fù)n次
{n,} 匹配重復(fù)n次或n次以上
{n,m} 匹配重復(fù)最少n次最多m次

除了這些常見的,想了解更多可以查閱文章上面推薦的一篇語法文章崭参。

以下是摘自一位作者的總結(jié)呵曹,感覺很不錯,就拿來用了何暮,出自此處

一奄喂、校驗數(shù)字的表達式

  • 數(shù)字:^[0-9]*$
  • n位的數(shù)字:^\d{n}$
  • 至少n位的數(shù)字:^\d{n,}$
  • m-n位的數(shù)字:^\d{m,n}$
  • 零和非零開頭的數(shù)字:^(0|[1-9][0-9]*)$
  • 非零開頭的最多帶兩位小數(shù)的數(shù)字:^([1-9][0-9]*)+(.[0-9]{1,2})?$
  • 帶1-2位小數(shù)的正數(shù)或負數(shù):^(-)?\d+(.\d{1,2})?$
  • 正數(shù)、負數(shù)郭卫、和小數(shù):^(-|+)?\d+(.\d+)?$
  • 有兩位小數(shù)的正實數(shù):^[0-9]+(.[0-9]{2})?$
  • 有1~3位小數(shù)的正實數(shù):^[0-9]+(.[0-9]{1,3})?$
  • 非零的正整數(shù):^[1-9]\d$ 或 ^([1-9][0-9]){1,3}$ 或 ^+?[1-9][0-9]*$
  • 非零的負整數(shù):^-[1-9][]0-9″$ 或 ^-[1-9]\d$
  • 非負整數(shù):^\d+$ 或 ^[1-9]\d*|0$
  • 非正整數(shù):^-[1-9]\d*|0$ 或 ^((-\d+)|(0+))$
  • 非負浮點數(shù):^\d+(.\d+)?$ 或 ^[1-9]\d.\d|0.\d[1-9]\d|0?.0+|0$
  • 非正浮點數(shù):^((-\d+(.\d+)?)|(0+(.0+)?))$ 或 ^(-([1-9]\d.\d|0.\d[1-9]\d))|0?.0+|0$
  • 正浮點數(shù):^[1-9]\d.\d|0.\d[1-9]\d$ 或 ^(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9]))$
  • 負浮點數(shù):^-([1-9]\d.\d|0.\d[1-9]\d)$ 或 ^(-(([0-9]+.[0-9][1-9][0-9])|([0-9][1-9][0-9].[0-9]+)|([0-9][1-9][0-9])))$
  • 浮點數(shù):^(-?\d+)(.\d+)?$ 或 ^-?([1-9]\d.\d|0.\d[1-9]\d|0?.0+|0)$

二砍聊、校驗字符的表達式

  • 漢字:^[\u4e00-\u9fa5]{0,}$
  • 英文和數(shù)字:^[A-Za-z0-9]+$ 或 ^[A-Za-z0-9]{4,40}$
  • 長度為3-20的所有字符:^.{3,20}$
  • 由26個英文字母組成的字符串:^[A-Za-z]+$
  • 由26個大寫英文字母組成的字符串:^[A-Z]+$
  • 由26個小寫英文字母組成的字符串:^[a-z]+$
  • 由數(shù)字和26個英文字母組成的字符串:^[A-Za-z0-9]+$
  • 由數(shù)字、26個英文字母或者下劃線組成的字符串:^\w+$ 或 ^\w{3,20}$
  • 中文贰军、英文玻蝌、數(shù)字包括下劃線:^[\u4E00-\u9FA5A-Za-z0-9_]+$
  • 中文、英文词疼、數(shù)字但不包括下劃線等符號:^[\u4E00-\u9FA5A-Za-z0-9]+$ 或 ^[\u4E00-\u9FA5A-Za-z0-9]{2,20}$
  • 可以輸入含有%&’,;=?$\”等字符:[%&’,;=?$\x22]+
  • 禁止輸入含有~的字符:[^%&’,;=?$\x22]+

三俯树、特殊需求表達式

  • Email地址:^\w+([-+.]\w+)@\w+([-.]\w+).\w+([-.]\w+)*$
  • 域名:[a-zA-Z0-9][-a-zA-Z0-9]{0,62}(/.[a-zA-Z0-9][-a-zA-Z0-9]{0,62})+/.?
  • InternetURL:[a-zA-z]+://[^\s]* 或 ^http://([\w-]+.)+[\w-]+(/[\w-./?%&=]*)?$?%24)
  • 手機號碼:^(13[0-9]|14[5|7]|15[0|1|2|3|5|6|7|8|9]|18[0|1|2|3|5|6|7|8|9])\d{8}$
  • 電話號碼(“XXX-XXXXXXX”、”XXXX-XXXXXXXX”贰盗、”XXX-XXXXXXX”许饿、”XXX-XXXXXXXX”、”XXXXXXX”和”XXXXXXXX):^((\d{3,4}-)|\d{3.4}-)?\d{7,8}$
  • 國內(nèi)電話號碼(0511-4405222舵盈、021-87888822):\d{3}-\d{8}|\d{4}-\d{7}
  • 身份證號(15位陋率、18位數(shù)字):^\d{15}|\d{18}$
  • 短身份證號碼(數(shù)字、字母x結(jié)尾):^([0-9]){7,18}(x|X)?$ 或 ^\d{8,18}|[0-9x]{8,18}|[0-9X]{8,18}?$
  • 帳號是否合法(字母開頭秽晚,允許5-16字節(jié)瓦糟,允許字母數(shù)字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
  • 密碼(以字母開頭,長度在6~18之間赴蝇,只能包含字母菩浙、數(shù)字和下劃線):^[a-zA-Z]\w{5,17}$
  • 強密碼(必須包含大小寫字母和數(shù)字的組合,不能使用特殊字符句伶,長度在8-10之間):^(?=.\d)(?=.[a-z])(?=.*[A-Z]).{8,10}$
  • 日期格式:^\d{4}-\d{1,2}-\d{1,2}
  • 一年的12個月(01~09和1~12):^(0?[1-9]|1[0-2])$
  • 一個月的31天(01~09和1~31):^((0?[1-9])|((1|2)[0-9])|30|31)$
  • 錢的輸入格式:
    • 有四種錢的表示形式我們可以接受:”10000.00” 和 “10,000.00”, 和沒有 “分” 的 “10000” 和 “10,000”:^[1-9][0-9]*$
    • .這表示任意一個不以0開頭的數(shù)字,但是,這也意味著一個字符”0″不通過,所以我們采用下面的形式:^(0|[1-9][0-9]*)$
    • .一個0或者一個不以0開頭的數(shù)字.我們還可以允許開頭有一個負號:^(0|-?[1-9][0-9]*)$
    • .這表示一個0或者一個可能為負的開頭不為0的數(shù)字.讓用戶以0開頭好了.把負號的也去掉,因為錢總不能是負的吧.下面我們要加的是說明可能的小數(shù)部分:^[0-9]+(.[0-9]+)?$
  • .必須說明的是,小數(shù)點后面至少應(yīng)該有1位數(shù),所以”10.”是不通過的,但是 “10” 和 “10.2” 是通過的:^[0-9]+(.[0-9]{2})?$
  • 這樣我們規(guī)定小數(shù)點后面必須有兩位,如果你認為太苛刻了,可以這樣:^[0-9]+(.[0-9]{1,2})?$22 7.這樣就允許用戶只寫一位小數(shù).下面我們該考慮數(shù)字中的逗號了,我們可以這樣:^[0-9]{1,3}(,[0-9]{3})(.[0-9]{1,2})?$23 8.1到3個數(shù)字,后面跟著任意個 逗號+3個數(shù)字,逗號成為可選,而不是必須:^([0-9]+|[0-9]{1,3}(,[0-9]{3}))(.[0-9]{1,2})?$
  • 備注:這就是最終結(jié)果了,別忘了”+”可以用”*”替代如果你覺得空字符串也可以接受的話(奇怪,為什么?)最后,別忘了在用函數(shù)時去掉去掉那個反斜杠,一般的錯誤都在這里
  • xml文件:^([a-zA-Z]+-?)+[a-zA-Z0-9]+.[x|X][m|M][l|L]$
  • 中文字符的正則表達式:[\u4e00-\u9fa5]
  • 雙字節(jié)字符:[^\x00-\xff] (包括漢字在內(nèi)劲蜻,可以用來計算字符串的長度(一個雙字節(jié)字符長度計2,ASCII字符計1))
  • 空白行的正則表達式:\n\s*\r (可以用來刪除空白行)
  • HTML標記的正則表達式:<(\S?){FNXX==XXFN}>.?|<.? /> (網(wǎng)上流傳的版本太糟糕考余,上面這個也僅僅能部分先嬉,對于復(fù)雜的嵌套標記依舊無能為力)
  • 首尾空白字符的正則表達式:\s*|\s*$或(\s)|(\s$) (可以用來刪除行首行尾的空白字符(包括空格、制表符楚堤、換頁符等等)坝初,非常有用的表達式)
  • 騰訊QQ號:[1-9][0-9]{4,} (騰訊QQ號從10000開始)
  • 中國郵政編碼:[1-9]\d{5}(?!\d) (中國郵政編碼為6位數(shù)字)
  • IP地址:\d+.\d+.\d+.\d+ (提取IP地址時有用)
  • 固定電話
    ^0\d{2}-?\d{8}$
    不管是010-88888888浸剩,還是02098989898都能進行正確匹配。
  • 密碼應(yīng)該包括一個或以上的大寫字母以及小寫字母
    (.*[A-Z]+.*[a-z]+.*$|.[a-z]+.[A-Z]+.*$)

小結(jié)

這算是一篇科普類文章鳄袍,對自己來說也是一個筆記绢要,以后用到相關(guān)的知識可以來此查看,中間引用了其他作者的作品拗小,再次表示感謝重罪,同時也文中也有指明出處。后續(xù)會持續(xù)更新新的使用方法哀九。(未完 待續(xù)........)

參考文章
iOS中的謂詞(NSPredicate)使用
正則表達式 NSRegularExpression

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末剿配,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子阅束,更是在濱河造成了極大的恐慌呼胚,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,198評論 6 514
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件息裸,死亡現(xiàn)場離奇詭異蝇更,居然都是意外死亡,警方通過查閱死者的電腦和手機呼盆,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,334評論 3 398
  • 文/潘曉璐 我一進店門年扩,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人访圃,你說我怎么就攤上這事厨幻。” “怎么了腿时?”我有些...
    開封第一講書人閱讀 167,643評論 0 360
  • 文/不壞的土叔 我叫張陵况脆,是天一觀的道長。 經(jīng)常有香客問我批糟,道長漠另,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,495評論 1 296
  • 正文 為了忘掉前任跃赚,我火速辦了婚禮,結(jié)果婚禮上性湿,老公的妹妹穿的比我還像新娘纬傲。我一直安慰自己,他們只是感情好肤频,可當我...
    茶點故事閱讀 68,502評論 6 397
  • 文/花漫 我一把揭開白布叹括。 她就那樣靜靜地躺著,像睡著了一般宵荒。 火紅的嫁衣襯著肌膚如雪汁雷。 梳的紋絲不亂的頭發(fā)上净嘀,一...
    開封第一講書人閱讀 52,156評論 1 308
  • 那天,我揣著相機與錄音侠讯,去河邊找鬼挖藏。 笑死,一個胖子當著我的面吹牛厢漩,可吹牛的內(nèi)容都是我干的膜眠。 我是一名探鬼主播,決...
    沈念sama閱讀 40,743評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼溜嗜,長吁一口氣:“原來是場噩夢啊……” “哼宵膨!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起炸宵,我...
    開封第一講書人閱讀 39,659評論 0 276
  • 序言:老撾萬榮一對情侶失蹤辟躏,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后土全,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體捎琐,經(jīng)...
    沈念sama閱讀 46,200評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,282評論 3 340
  • 正文 我和宋清朗相戀三年涯曲,在試婚紗的時候發(fā)現(xiàn)自己被綠了野哭。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,424評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡幻件,死狀恐怖拨黔,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绰沥,我是刑警寧澤篱蝇,帶...
    沈念sama閱讀 36,107評論 5 349
  • 正文 年R本政府宣布,位于F島的核電站徽曲,受9級特大地震影響零截,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜秃臣,卻給世界環(huán)境...
    茶點故事閱讀 41,789評論 3 333
  • 文/蒙蒙 一涧衙、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧奥此,春花似錦弧哎、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,264評論 0 23
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至蠢终,卻和暖如春序攘,著一層夾襖步出監(jiān)牢的瞬間茴她,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,390評論 1 271
  • 我被黑心中介騙來泰國打工程奠, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留丈牢,地道東北人。 一個月前我還...
    沈念sama閱讀 48,798評論 3 376
  • 正文 我出身青樓梦染,卻偏偏與公主長得像赡麦,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子帕识,可洞房花燭夜當晚...
    茶點故事閱讀 45,435評論 2 359

推薦閱讀更多精彩內(nèi)容