iOS 正則表達式

前言

在實際開發(fā)中份名,基本每一個APP都會有登錄注冊功能箱吕,在登錄注冊時需要驗證用戶輸入的內(nèi)容是否符合規(guī)定荣病;甚至有時需要在字符串中查找截取符合要求的字符串栋操,這時就需要使用到正則表達式闸餐。正則表達式看起來特別難,沒有什么規(guī)律可循矾芙,我個人認(rèn)為我們并沒有必要去深入的研究舍沙,搞懂日常開發(fā)中經(jīng)常會使用到的即可!

正則表達式是什么鬼剔宪?

正則表達式就是用“字符串”來描述一種規(guī)則特征拂铡,然后再去驗證另外一個“字符串”是否符合這個特征。Eg:表達式“ab+”描述的特征為:驗證字符串包含一個"a"和N個(N >= 1)b,類似"ab"葱绒、"abb"感帅、"abbb"都符合這個特征。

正則表達式可以用來干什么哈街?

1.驗證字符串是否符合指定特征留瞳,比如驗證是否為合法郵箱地址;
2.用來查找字符串骚秦,從一個長的文本中查找符合指定特征的字符串她倘,比如查找固定字符串更加靈活便捷;
3.進行字符串替換作箍,比較普通替換更加強大硬梁;

元字符

正則表達式預(yù)言由兩種基本字符類型組成:原義文本字符元字符
元字符使正則表達式具有處理能力,所謂元字符就是指那些在正則表達式中具有特殊意義的專用字符胞得,可以用來規(guī)定其前導(dǎo)字符(即位于元字符前面的字符)在目標(biāo)對象中的出現(xiàn)模式

常用元字符

元字符 描述
^ 匹配輸入字符串開始位置
$ 匹配輸入字符串結(jié)束為止
. 匹配除換行意外的任意字符
|
, 分割
[] 包含荧止,默認(rèn)一個字符長度
[0-9] 匹配0~9的數(shù)字
[a-z] 匹配小寫英文字母
[A-Z] 匹配大寫英文字母
[a-zA-Z] 匹配英文字母
[a-zA-Z0-9] 匹配英文字母數(shù)字
[^] 不包含,默認(rèn)一個字符長度
{n} 重復(fù)n次
{n,} 重復(fù)>= n次
{n,m} n<= 重復(fù)次數(shù) <= m
* 重復(fù)次數(shù) >= 0
+ 重復(fù)次數(shù) >=1
? 重復(fù)次數(shù)0次或1次
\ 轉(zhuǎn)義字符
\d 匹配數(shù)字
\w 匹配字母、數(shù)字或下劃線
\s 匹配空白字符:空格跃巡、制表符危号、換頁符等
\D 匹配非數(shù)字字符
\W 匹配所有與非字母、非數(shù)字素邪、非下劃線字符
\S 匹配非空白字符
簡單說明

Question:[0-9] 和 \d 區(qū)別
\d匹配的是Unicode,要進行各種語言中數(shù)字字符的篩選:
012345789???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
[0-9]匹配的則是阿拉伯?dāng)?shù)字:0 1 2 3 4 5 6 7 8 9
相比較而言[0-9]的匹配效率更高一點;

簡單舉例說明一下如何使用上述元字符

手機號碼正則匹配
  • 11位數(shù)字匹配:^[0-9]{11}$,[0-9]表示阿拉伯?dāng)?shù)字0~9外莲,{11}表示重復(fù)11次;
  • 11位數(shù)字,第一位為"1":^1[0-9]{10}$,1表示開始位置為"1",[0-9]{10}表示0~9的數(shù)字重復(fù)10次
  • 11位數(shù)字兔朦,第一位為"1",第二位為"3"偷线、"4"、"5"沽甥、"7"声邦、"8":^1[3|4|5|7|8][0-9]{9}&1表示第一位是1,[3|4|5|7|8]表示第二位是3摆舟、4亥曹、5、7或8盏檐,[0-9]{9}表示0到9的數(shù)字重復(fù)9次

常用正則表達式

  • 身份證號碼
NSString *regex = @"^(\\d{14}|\\d{17})(\\d|[xX])$";
  • 英文字母開頭
NSString *ZIMU = @"^[A-Za-z]+$";
  • 郵箱地址
NSString *regex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
  • 手機號碼
/**
     * 手機號碼
     * 移動: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}$";
    /**
     * 中國移動:China Mobile
     * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
     */
    NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$";
    /**
     * 中國聯(lián)通:China Unicom
     * 130,131,132,152,155,156,185,186
     */
    NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";
    /**
     * 中國電信:China Telecom
     * 133,1349,153,180,189
     */
    NSString * CT = @"^1((33|53|77|8[019])[0-9]|349)\\d{7}$";
    /**
     * 大陸地區(qū)固話及小靈通
     * 區(qū)號:010,020,021,022,023,024,025,027,028,029
     * 號碼:七位或八位
     */
  • 網(wǎng)址鏈接
NSString *regex = @"http(s)?:\\/\\/([\\w-]+\\.)+[\\w-]+(\\/[\\w- .\\/?%&=]*)?";
  • 護照
/** 第一位是字母歇式,后面都是數(shù)字
     
     P:P開頭的是因公普通護照
     D:外交護照是D開頭
     E: 有電子芯片的普通護照為“E”字開頭,
     S: 后接8位阿拉伯?dāng)?shù)字公務(wù)護照
     G:因私護照G開頭
     14:
     15:
     
     H:香港特區(qū)護照和香港公民所持回鄉(xiāng)卡H開頭,后接10位數(shù)字
     M:澳門特區(qū)護照和澳門公民所持回鄉(xiāng)卡M開頭,后接10位數(shù)字
     */
    NSString *regex = @"^1[45][0-9]{7}|([P|p|S|s]\\d{7})|([S|s|G|g]\\d{8})|([Gg|Tt|Ss|Ll|Qq|Dd|Aa|Ff]\\d{8})|([H|h|M|m]\\d{8胡野,10})$";
  • 汽車車牌號
NSString *carRegex = @"^[\u4e00-\u9fa5]{1}[a-zA-Z]{1}[a-zA-Z_0-9]{4}[a-zA-Z_0-9_\u4e00-\u9fa5]$";
  • 驗證碼
NSString *regex = @"^(\\d{6})";
  • 用戶名
NSString *userNameRegex = @"^[A-Za-z0-9]{4,20}+$";
  • 密碼
NSString *passWordRegex = @"^[a-zA-Z0-9]{6,20}+$";
  • 密碼強度
NSString *regex = @"^(?=.*\\d.*)(?=.*[a-zA-Z].*).{6,20}$";
  • 昵稱
NSString *nicknameRegex = @"([\u4e00-\u9fa5]{2,5})(&middot;[\u4e00-\u9fa5]{2,5})*";
  • 銀行卡號
NSString *regex = @"^(\\d{15,30})";
  • 銀行卡號后四位
NSString *regex = @"^(\\d{4})";
  • 全英文字母
NSString *reges = @"^[A-Za-z]+$";
  • 全英文大寫字母
NSString *reges = @"^[A-Z]+$";
  • 全英文小寫字母
NSString *reges = @"^[a-z]+$";
  • 全英文字母數(shù)字
NSString *reges = @"^[A-Za-z0-9]+$";

現(xiàn)在我們說說iOS開發(fā)者中如何使用這些正則表達式:

1.NSPredicate(驗證字符串):
// 需要驗證的字符串
    NSString *mobilePhone = @"13227008888";
    // 編寫正則表達式材失,驗證mobilePhone是否為手機號碼
    NSString *regex = @"^1[3|4|5|7|8][0-9]{9}$";
    // 創(chuàng)建謂詞對象并設(shè)定條件表達式
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@",regex];
    // 字符串判斷,然后BOOL值
    BOOL result = [predicate evaluateWithObject:mobilePhone];
    NSLog(@"result : %@",result ? @"正規(guī)手機號碼" : @"驗證失敗");
    // result : 正規(guī)手機號碼
2.NSString 字符串查找
- (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask;
NSRange range = [mobilePhone rangeOfString:regex options:NSRegularExpressionSearch];
    if (range.location != NSNotFound) {
        // 找到
        NSLog(@"%@",NSStringFromRange(range));
    }else{
        //未找到
    }
3.NSRegularExpression(查找字符串):
NSError *error;
    NSString *rangeRegex = @"[8]{4}";
    NSRegularExpression *regular = [NSRegularExpression regularExpressionWithPattern:rangeRegex options:0 error:&error];
    if (!error) {
        NSTextCheckingResult *match = [regular firstMatchInString:mobilePhone options:0 range:NSMakeRange(0, [mobilePhone length])];
        if (match) {
            NSString *result = [mobilePhone substringWithRange:match.range];
            NSLog(@"%@",result);
        }
    }else{
        NSLog(@"error -- %@",error);
    }

結(jié)束語

到這里硫豆,我們基本已經(jīng)掌握了常用開發(fā)中的所有正則表達式的使用和如何使用元字符創(chuàng)建一個正則表達式龙巨。
文章中的相關(guān)正則表達式已經(jīng)在GitHub中上傳了相關(guān)代碼,并且大家可以使用CocoaPods進行搜索導(dǎo)入熊响!歡迎大家使用旨别!

pod search WYQRegexHelper
-> WYQRegexHelper (0.0.1)
   提供iOS開發(fā)常用正則表達式
   pod 'WYQRegexHelper', '~> 0.0.1'
   - Homepage: https://github.com/YongQiangWei/RegularExpressionTool
   - Source:   https://github.com/YongQiangWei/RegularExpressionTool.git
   - Versions: 0.0.1 [master repo]
(END)

下一篇文章 向大家介紹GitHub代碼上傳

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末汗茄,一起剝皮案震驚了整個濱河市秸弛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌洪碳,老刑警劉巖递览,帶你破解...
    沈念sama閱讀 218,755評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異瞳腌,居然都是意外死亡绞铃,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,305評論 3 395
  • 文/潘曉璐 我一進店門嫂侍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來儿捧,“玉大人荚坞,你說我怎么就攤上這事》贫埽” “怎么了颓影?”我有些...
    開封第一講書人閱讀 165,138評論 0 355
  • 文/不壞的土叔 我叫張陵,是天一觀的道長亿汞。 經(jīng)常有香客問我瞭空,道長,這世上最難降的妖魔是什么疗我? 我笑而不...
    開封第一講書人閱讀 58,791評論 1 295
  • 正文 為了忘掉前任,我火速辦了婚禮南捂,結(jié)果婚禮上吴裤,老公的妹妹穿的比我還像新娘。我一直安慰自己溺健,他們只是感情好麦牺,可當(dāng)我...
    茶點故事閱讀 67,794評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著鞭缭,像睡著了一般剖膳。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上岭辣,一...
    開封第一講書人閱讀 51,631評論 1 305
  • 那天吱晒,我揣著相機與錄音,去河邊找鬼沦童。 笑死仑濒,一個胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的偷遗。 我是一名探鬼主播墩瞳,決...
    沈念sama閱讀 40,362評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼氏豌!你這毒婦竟也來了喉酌?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,264評論 0 276
  • 序言:老撾萬榮一對情侶失蹤泵喘,失蹤者是張志新(化名)和其女友劉穎泪电,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體涣旨,經(jīng)...
    沈念sama閱讀 45,724評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡歪架,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,900評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了霹陡。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片和蚪。...
    茶點故事閱讀 40,040評論 1 350
  • 序言:一個原本活蹦亂跳的男人離奇死亡止状,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出攒霹,到底是詐尸還是另有隱情怯疤,我是刑警寧澤,帶...
    沈念sama閱讀 35,742評論 5 346
  • 正文 年R本政府宣布催束,位于F島的核電站集峦,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏抠刺。R本人自食惡果不足惜塔淤,卻給世界環(huán)境...
    茶點故事閱讀 41,364評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望速妖。 院中可真熱鬧高蜂,春花似錦、人聲如沸罕容。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,944評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽锦秒。三九已至露泊,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間旅择,已是汗流浹背惭笑。 一陣腳步聲響...
    開封第一講書人閱讀 33,060評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留砌左,地道東北人脖咐。 一個月前我還...
    沈念sama閱讀 48,247評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像汇歹,于是被迫代替她去往敵國和親屁擅。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,979評論 2 355