正則表達式

首先說下正則表達式的定義:

正則表達式是對字符串操作的一種邏輯公式柱嫌,正則表達式可以檢測給定的字符串是否符合我們定義的邏輯胃珍,也可以從字符串中獲取我們想要的特定部分,他可以迅速地用極簡單的方式達到字符串的復雜控制或者說在編寫處理字符串的程序時傅蹂,經(jīng)常會有查找符合某些復雜規(guī)則的字符串的需要励稳,正則表達式就是用于描述這些規(guī)則的工具,換句話說犬金,正則表達式就是記錄文本規(guī)則的代碼

那么正則表達式能做什么呢?1.給定的字符串是否符合正則表達式的過濾邏輯(表單驗證);2.從字符串中獲取我們的想要部分(對字符串進行處理)
再簡單介紹下正則的寫法:正則表達式念恍,由一些普通字符和一些元字符組成,普通字符包括大小寫字母和數(shù)字晚顷,而元字符則具有特殊的含義.那么特殊符號都有哪些呢?我們又具體怎么使用它們呢?
'^'和'$'他們的作用是分別指出一個字符的開始和結(jié)束.
舉個例子:^one:表示所有以one開始的字符串("one cat,one123")峰伙,類似于OC中的hasPrefix方法;a dog$ 以 a dog 結(jié)尾;^apple$,那么這樣的話只能是apple.
' * '  ' + '   ' 该默?'這三個符號表示一個或N個字符重復出現(xiàn)的次數(shù)
ab*表示一個字符串有一個a后面跟著零個或若干個b
ab+表示一個字符串有一個a后面跟著至少一個b或更多個b
ab瞳氓?表示一個字符串有一個a后面跟著零個或一個b
a?b+$表示在字符串的末尾有零個或一個a跟著一個或幾個b
{}表示一個重復的具體范圍
ab{4}表示一個字符串一個a跟著4個b
ab{1,}表示一個字符串有一個a跟著至少一個b
ab{3,4}表示一個字符串有一個a跟著3到4個b
那么*用{0,}表示 +用{1栓袖,}表示 ?用{0匣摘,1}
注意:可以沒有上限,但不能沒有下限
|表示或操作 
a|b表示一個字符串里有a或者b
(a|b)*c表示一串a(chǎn)裹刮,b混合的字符串后面跟一個c
[]表示在括號內(nèi)的眾多字符中音榜,選擇1個括號內(nèi)的符合語法的字符作為結(jié)果
[a-d]表示a到d中的一個
.代表除了\r\n ....之外的任何單個字符
     a.[a-z]表示一個字符串有一個a后面跟著一個任意字符
     ^.{5}$表示任意1個長度為五的字符串
     在[]里面用^表示不希望出現(xiàn)的字符,
     @[^a-zA-Z]4@表示兩個@中不應該出現(xiàn)的字母
     \d匹配一個數(shù)字字符捧弃,等價于[0-9]
     \D匹配一個非數(shù)字字符赠叼,等價于[^0-9]
     \w匹配包括下劃線的任何單詞字符,等價于[A-Za-z0-9_]
     \W匹配任何非單詞字符 等價于[^A-Za-z0-9]
     \轉(zhuǎn)義

接下來說下在項目里常用的正則表達式

驗證身份證號                  ^\\d{17}[0-9xX]$
     只能輸入數(shù)字和字母組成的字符串   ^[a-zA-Z0-9]+$
     整數(shù)或小數(shù)                    ^[0-9]+([.][0-9]+){0,1}$
     只能是數(shù)字                    ^[0-9]*$
     只能輸入n位數(shù)字               ^\\d{n}$
     只能輸入m~n位數(shù)字             ^\\d{m,n}$
     只能輸入非0的正整數(shù)            ^\\+?[1-9][0-9]*$
     只能輸入非0的負整數(shù)            ^\\-[1-9][0-9]*$
     只能輸入字母組成的字符串        ^[a-zA-Z]+$
     判讀是否輸入了含有^%&',;=?$\\的特殊字符     .*[%&',;=?$\\^]+.*
     只能輸入漢字                  ^[\u4e00-\u9fa5]{0,}$
     驗證URL      ^https?://([\\w-]+\\.)+[\\w-]+(/[\\w-./?%&=]*)?$
     驗證一年12個月                ^(0?[1-9]|1[0-2])$

然后我們說下怎么用正則表達式去進行匹配進而去進行判斷

//NSRegularExpression正則表達式類
   // NSTextCheckingResult文本檢查結(jié)果類
    
    //要匹配的字符串
    NSString *str = @"130120199411060039";
    //正則語句
    NSString *emailRegex = @"\\d{17}[0-9xX]";
    //謂詞NSPredicate 作用:1.驗證正則表達式是否正確2.過濾數(shù)據(jù)和sql的where指定條件類似
    NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES%@",emailRegex];
    //判斷
    BOOL i = [emailTest evaluateWithObject:str];
    if (i) {
        NSLog(@"正確");
    }else{
        NSLog(@"錯誤");
    }
NSArray *array = @[@"jim",@"cook",@"jobs",@"sdeven"];
    //創(chuàng)建謂詞對象,設(shè)置過濾條件
    NSPredicate *pre = [NSPredicate predicateWithFormat:@"length>3"];
    //對數(shù)組進行過濾得到一個新的數(shù)組
    NSArray *arr = [array filteredArrayUsingPredicate:pre];
    NSLog(@"%@",arr);
    
    NSArray *array1 = @[@"2",@"3",@"4",@"5"];
    NSPredicate *pre1 = [NSPredicate predicateWithFormat:@"integerValue>=%@",@3];
    NSLog(@"%@",[array1 filteredArrayUsingPredicate:pre1]);
    
    
    
    NSArray *arr2=@[@1,@6,@3];
    NSPredicate *pre2 = [NSPredicate predicateWithFormat:@"SELF BETWEEN{1,3}"];
    NSArray *arr3=[arr2 filteredArrayUsingPredicate:pre2];
    NSLog(@"%@",arr3);
    
    //在謂詞里面使用BETWEEN在什么之間,如果不想用任何實例方法嘴办,想篩選成員本身應該怎么做呢霜第,這時候就用self來代替; CONTAINS包含
    //返回結(jié)果的類NSTextCheckingResult
    //待檢測的字符串
    NSString *searchText = @"12345";
    //定義錯誤
    NSError *error = NULL ;
    NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[0-9]+$" options:NSRegularExpressionCaseInsensitive error:&error];
    //返回第一個匹配結(jié)果
    NSTextCheckingResult *result = [regex firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
    
    //若匹配成功
    if (result) {
        //輸出匹配結(jié)果
        NSLog(@"%@",[searchText substringWithRange:result.range]);
    }

就現(xiàn)在來說,在我們的APP中,用到的最多的應該也是對手機號進行判斷了,輸入手機號收驗證碼或者將手機號最為賬號都是很普遍的情況,我們來看下怎么對三大運營商的手機號進行判斷.

//驗證手機號
+ (BOOL)isValidateMobile:(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,184,187,188
 12         */
NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[2478])\\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)){
return YES;
}
else
{
return NO;
}
}
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末户辞,一起剝皮案震驚了整個濱河市泌类,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌底燎,老刑警劉巖刃榨,帶你破解...
    沈念sama閱讀 211,423評論 6 491
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異双仍,居然都是意外死亡枢希,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,147評論 2 385
  • 文/潘曉璐 我一進店門朱沃,熙熙樓的掌柜王于貴愁眉苦臉地迎上來苞轿,“玉大人,你說我怎么就攤上這事逗物“嶙洌” “怎么了?”我有些...
    開封第一講書人閱讀 157,019評論 0 348
  • 文/不壞的土叔 我叫張陵翎卓,是天一觀的道長契邀。 經(jīng)常有香客問我,道長失暴,這世上最難降的妖魔是什么坯门? 我笑而不...
    開封第一講書人閱讀 56,443評論 1 283
  • 正文 為了忘掉前任,我火速辦了婚禮逗扒,結(jié)果婚禮上古戴,老公的妹妹穿的比我還像新娘。我一直安慰自己矩肩,他們只是感情好现恼,可當我...
    茶點故事閱讀 65,535評論 6 385
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著蛮拔,像睡著了一般述暂。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上建炫,一...
    開封第一講書人閱讀 49,798評論 1 290
  • 那天畦韭,我揣著相機與錄音,去河邊找鬼肛跌。 笑死艺配,一個胖子當著我的面吹牛察郁,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播转唉,決...
    沈念sama閱讀 38,941評論 3 407
  • 文/蒼蘭香墨 我猛地睜開眼皮钠,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了赠法?” 一聲冷哼從身側(cè)響起麦轰,我...
    開封第一講書人閱讀 37,704評論 0 266
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎砖织,沒想到半個月后款侵,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 44,152評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡侧纯,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 36,494評論 2 327
  • 正文 我和宋清朗相戀三年新锈,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片眶熬。...
    茶點故事閱讀 38,629評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡妹笆,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出娜氏,到底是詐尸還是另有隱情拳缠,我是刑警寧澤,帶...
    沈念sama閱讀 34,295評論 4 329
  • 正文 年R本政府宣布牍白,位于F島的核電站脊凰,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏茂腥。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 39,901評論 3 313
  • 文/蒙蒙 一切省、第九天 我趴在偏房一處隱蔽的房頂上張望最岗。 院中可真熱鬧,春花似錦朝捆、人聲如沸般渡。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,742評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽驯用。三九已至,卻和暖如春儒老,著一層夾襖步出監(jiān)牢的瞬間蝴乔,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,978評論 1 266
  • 我被黑心中介騙來泰國打工驮樊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留薇正,地道東北人片酝。 一個月前我還...
    沈念sama閱讀 46,333評論 2 360
  • 正文 我出身青樓,卻偏偏與公主長得像挖腰,于是被迫代替她去往敵國和親雕沿。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 43,499評論 2 348

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