iOS學(xué)習筆記之正則表達式

前言

基本上每個 App 都有登錄注冊功能基公,在登錄注冊時需要驗證用戶所輸入的內(nèi)容是否符合規(guī)定;有時要在字符串中查找并截取符合要求的字符串空凸,這時就需要用到正則表達式避矢。正則表達式看起來晦澀難懂,沒有什么規(guī)律可循龟再,但是我們并不用深入研究书闸,只需要簡單了解,滿足日常開發(fā)即可利凑。

什么是正則表達式浆劲?

正則表達式就是用一個“字符串”來描述一個特征,然后去驗證另一個“字符串”是否符合這個特征哀澈。比如 表達式“ab+” 描述的特征是“一個 'a' 和 任意個 'b' ”牌借,那么 'ab', 'abb', 'abbbb' 都符合這個特征。

正則表達式可以用來做什么割按?

  1. 驗證字符串是否符合指定特征膨报,比如驗證是否是合法的郵件地址。
  1. 用來查找字符串适荣,從一個長的文本中查找符合指定特征的字符串现柠,比查找固定字符串更加靈活方便。
  2. 用來替換束凑,比普通的替換更強大。

元字符

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

常用元字符:

元字符 描述
^ 匹配輸入字符串開始的位置
$ 匹配輸入字符串結(jié)尾的位置
. 匹配除換行符以外的任意字符
, 分割
[ ] 包含,默認是一個字符長度
[0-9] 匹配0到9的數(shù)字
[a-z] 匹配小寫字母
[A-Z] 匹配大寫字母
[A-Za-z] 匹配字母
[A-Za-z0-9] 匹配字母數(shù)字
[^] 不包含,默認是一個字符長度
{n} 重復(fù)n次
{n,} 重復(fù)≥n次
{n,m} 重復(fù)≥n且≤m次
* 重復(fù)零次或更多次
+ 重復(fù)一次或更多次
? 重復(fù)零次或一次
\ 轉(zhuǎn)義
\d 匹配數(shù)字
\w 匹配字母迄本、數(shù)字或下劃線字符
\s 匹配空白字符:空格、制表符嘉赎、換頁符等
\D 匹配非數(shù)字字符
\W 匹配所有與\w不匹配的字符
\S 匹配非空白字符

這里只列舉了比較常用的元字符置媳,如果想查看更多,戳這里公条。

小插曲:熟悉Markdown語法的應(yīng)該知道拇囊,制表需要使用到"|"靶橱,如果要在表內(nèi)顯示這個符號要怎么做呢?轉(zhuǎn)義关霸、&#124、0x2502這些試過了都不行膘掰,最后從別的地方復(fù)制了一個中文的"|"才在表中顯示出來了英上。如果有別的方法炭序,可以一起交流討論下苍日。

補充
[0-9]\d有什么區(qū)別窗声?
\d匹配的是Unicode相恃,要篩選各種語言里的數(shù)字字符:
012345789???????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????
[0-9]匹配的是阿拉伯數(shù)字:0123456789
所以[0-9]的效率更高拦耐。

例子 :

只是知道了元字符的含義可能還是不能很好地理解正則表達式,通過對照上表和下面例子來加深一下理解:

手機號

  • 11位數(shù)字:^[0-9]{11}$杀糯,[0-9]表示0到9的數(shù)字苍苞,{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次

常用正則表達式

  1. 用戶名和密碼翅楼,由6~16位字母、數(shù)字理茎、下劃線組成且第一位是字母:
    ^[a-zA-Z]\w{5,15}$
  2. 電話號碼:
    ^(\d{3,4}-)\d{7,8}$
  3. 手機號碼:
    ^1[3|4|5|7|8][0-9]{9}$
  4. 身份證號(15位或18位數(shù)字):
    ^\d{14}[[0-9],0-9xX]$
  5. Email地址:
    ^\w+([-+.]\w+)*@\w+([-.]\w+)*.\w+([-.]\w+)$*
  6. URL:
    ^http://([\w-]+.)+[\w-]+(/[\w-./?%&=])?$*
  7. QQ號(從10000開始):
    ^[1-9][0-9]{4,}$
  8. 中國郵政編碼:
    ^[1-9]\d{5}$
  9. n位的數(shù)字:
    ^\d{n}$
  10. 至少n位的數(shù)字:
    ^\d{n,}$
  11. m~n位的數(shù)字:
    ^\d{m,n}$
  12. 整數(shù)或者小數(shù):
    ^[0-9]+([.][0-9]+){0,1}$
  13. 有1~3位小數(shù)的正實數(shù):
    ^[0-9]+(.[0-9]{1,3})?$
  14. 漢字:
    ^[\u4e00-\u9fa5]{0,}$

正則表達式在iOS中的使用

注意:在寫正則表達式時:所有的""都需要轉(zhuǎn)義管嬉,即:"\\"

1.NSPredicate(驗證字符串):

// 要驗證的字符串
NSString *phoneNumber = @"15212345678";
// 編寫正則表達式
NSString *regular = @"^1[3|4|5|7|8][0-9]{9}$";
// 創(chuàng)建謂詞對象并設(shè)定條件的表達式
NSPredicate *numberPre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regular];
// 對字符串判斷,該方法會返回BOOL值
[numberPre evaluateWithObject:phoneNumber];

2.NSString(查找字符串):

- (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask;
NSString *string = @"手機號:15212345678";
NSRange range = [string rangeOfString:@"^1[3|4|5|7|8][0-9]{9}$" options:NSRegularExpressionSearch];
if (range.location != NSNotFound) { // 判斷是否查找到
    // 查找到
} else {
    // 未查找到
}

3.NSRegularExpression(查找字符串):

NSString *string = @"手機號:15212345678";
NSError *error;
// 創(chuàng)建NSRegularExpression對象并指定正則表達式
NSRegularExpression *regex = [NSRegularExpression
                                  regularExpressionWithPattern:@"^1[3|4|5|7|8][0-9]{9}$"
                                  options:0
                                  error:&error];
if (!error) { // 如果沒有錯誤
    // 獲取特定字符串的范圍
    NSTextCheckingResult *match = [regex firstMatchInString:string options:0 range:NSMakeRange(0, [string length])];
    if (match) {
        // 截獲特定的字符串
        NSString *result = [string substringWithRange:match.range];
        NSLog(@"%@", result);
    }
} else { // 如果有錯誤础倍,則把錯誤打印出來
    NSLog(@"error - %@", error);
}

結(jié)語:

正則表達式的知識遠遠不止這些胎挎,不過以上內(nèi)容就可以滿足日常開發(fā)了扰楼。以后有時間的話會再深入了解的美浦。
  如有錯誤之處,還請指正蹬竖。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末流酬,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子芽腾,更是在濱河造成了極大的恐慌,老刑警劉巖阴绢,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件艰躺,死亡現(xiàn)場離奇詭異,居然都是意外死亡左电,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進店門篓足,熙熙樓的掌柜王于貴愁眉苦臉地迎上來闰蚕,“玉大人,你說我怎么就攤上這事辱魁∈迹” “怎么了参滴?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長砾赔。 經(jīng)常有香客問我青灼,道長,這世上最難降的妖魔是什么杂拨? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任悯衬,我火速辦了婚禮,結(jié)果婚禮上筋粗,老公的妹妹穿的比我還像新娘。我一直安慰自己丽已,他們只是感情好买决,可當我...
    茶點故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著瘸味,像睡著了一般够挂。 火紅的嫁衣襯著肌膚如雪旁仿。 梳的紋絲不亂的頭發(fā)上孽糖,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天办悟,我揣著相機與錄音,去河邊找鬼病蛉。 笑死,一個胖子當著我的面吹牛铺然,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播赋铝,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼沽瘦,長吁一口氣:“原來是場噩夢啊……” “哼农尖!你這毒婦竟也來了良哲?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤窟扑,失蹤者是張志新(化名)和其女友劉穎漏健,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體蔫浆,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡瓦盛,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了原环。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡玄组,死狀恐怖谒麦,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情绕德,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布踪蹬,位于F島的核電站臣咖,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏亡哄。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一愿卸、第九天 我趴在偏房一處隱蔽的房頂上張望截型。 院中可真熱鬧,春花似錦宦焦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至歹篓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間庄撮,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工毡庆, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留烙如,地道東北人。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓乖坠,卻偏偏與公主長得像,于是被迫代替她去往敵國和親熊泵。 傳聞我的和親對象是個殘疾皇子甸昏,可洞房花燭夜當晚...
    茶點故事閱讀 45,691評論 2 361

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