iOS開發(fā)中正則表達式的基礎使用

正則表達式晨汹?什么是正則表達式?
百度百科給出的解釋是這樣的:正則表達式使用單個字符串來描述桃漾、匹配一系列符合某個句法規(guī)則的字符串坏匪。
根據我的學習,我理解的正則表達式是:一個字符串撬统,這個字符串用來描述我們所制定的規(guī)則适滓。

學習正則表達式,就好像學習一門新的語言恋追,只是這種語言是用來制定規(guī)則的凭迹。學習一門新語言,我們一般從helloworld開始苦囱。
例如我們在要一個很長的字符串中找到hellowrold嗅绸,那么我們就可以使用正則表達式 helloworld 。helloworld這個正則表達式是最簡單類型的正則表達式了撕彤,它會匹配這樣的字符串:按著helloworld這樣的順序排列的字符串朽砰。

這里介紹一下正則表達式中的一些特殊代碼,也叫做元字符(metacharacter)喉刘。在我看來瞧柔,這些元字符類似我們OC語言中的關鍵字。(當然正則表達式的與字符肯定不止這么點睦裳,但一下的我覺得已經夠我們開發(fā)使用的了)

\b:代表著單詞的開頭或結尾造锅,作為單詞的分界處。
例如:正則表達式 h i會匹配到包含有 hi 這兩個連續(xù)字母的單詞廉邑,像history哥蔚、him。而如果加上\b蛛蒙,是正則表達式變成這樣 \bhi\b那么就只會匹配到 hi 這個單詞

. (英語中的句號): 匹配除了換行符以外的任意字符糙箍。
例如:正則表達式 \ba.\b(\b是代表單詞開頭或結束的元字符,上面已經介紹) 匹配以 前面一個是字符a牵祟,后面是一個除換行符意外的任意字符的字符串深夯,像aa、ab诺苹、a_咕晋、a+ 這些都可以匹配到

\d:匹配一個數字(0-9)
例如:正則表達式 0\d\d\d\d\9 匹配以0開都,以9結尾的一串6個數字的數字串收奔,中間的四個數字可以是0到9中任意的數字掌呜,像056789、043629等等

\w:匹配字母或數字或下劃線或漢字
例如:正則表達式 \w\w\w\w 匹配任意的四個字母或數字或下劃線或漢字坪哄,像中文中的成語:十動然拒质蕉、普大喜奔 這種類型的势篡,或者是:main、void 這種四個字母的單詞模暗,或者是:5_a禁悠、壕b6 這種雜交的類型

\s:匹配任意的空白字符(上面說了這么多,這個沒什么好說的了汰蓉,應該挺好理解的把)

ps:上面的介紹的元字符是用來匹配特殊的格式或者字符的绷蹲,而下面的幾個則用來匹配數量的

*(星號) :重復零次或多次
例如:正則表達式 a\d
匹配以字符a開頭的棒卷,后面跟著0個或者多個數字的字符串:a顾孽、a1、a94803748 這些都是該正則表達式匹配的字符串比规;

+:重復1次或多次
例如:正則表達式 a\d+ 匹配的是以字符a開頭的若厚,后面跟著1個或多個數字的字符串:a3、a5856306 蜒什,但是不能匹配 a 應為+代表最少要有一個测秸;

?:重復0次或1次
和上面兩個類似灾常,表達式 a\d? 匹配的是以字符a開頭的霎冯,后面跟著0個或一個數字的字符串:a、a5钞瀑、a9

{n}:重復n次
例如:我們的身份證號沈撞,一般來說是18位的數字(實際上身份證的驗證要復雜得多,這里只是舉個栗子)雕什,那么我們可以寫這么一個正則表達式來匹配它:\d{18} 缠俺,又例如我們銀行卡的取款密碼,一般來說是6位的數字贷岸,那么我們就可以寫:\d{6} 這樣的正則表達式來匹配壹士。

{n,}:重復n次或更多次(即最少都要重復n次)
例如:現在很多網站的賬號注冊時,密碼都要求不少于多少個數偿警,那么我們就可以這么寫:\d{6,} 躏救,這是不少于6位的數字

{n,m}:重復n到m次(最少重復n次,最多重復m次)
例如:QQ的賬號要求是5到12位螟蒸, 那么可以用正則表達式:\d{5,12} 來匹配

好了落剪,以上介紹到得元字符基本上可以滿足我們開發(fā)要求了。

接著還有幾點是要注意的:
[]的使用:
[abcdef] 這個正則表達式匹配abcdef中其中一個字母尿庐,[.?!]這個正則表達式匹配里面三個標點符號中的其中一個忠怖。我們也可以用來指定一個范圍,[0-9]匹配0到9這段區(qū)間中任意一個數字(包括0和9)抄瑟。[a-z]這里就是匹配a到z這段區(qū)間其中一個字母凡泣。我們還可以這幾個范圍連在一起使用枉疼,比如[0-9a-zA-Z]就是匹配 0到9、a到z鞋拟、A到Z 這三個區(qū)間的其中一個區(qū)間的其中一個字符或數字骂维。

分支條件:有時候,當我們要制定的規(guī)則有多種形式的時候贺纲,所以我們需要一個“或”符號來連接兩種形式航闺。
舉個栗子:我們的電話號碼可以用兩種形式表示:020-88888888 (020)88888888。要讓讓這兩種形式的寫法都可以匹配猴誊,我們就要寫兩種形式的正則表達式潦刃,匹配020-88888888 的正則表達式可以寫為:0\d{2}-\d{8};匹配(020)88888888的正則表達式我們可以寫成:(0\d{2})\d{8}懈叹。如果要使這兩個正則表達式一起匹配一個字符串乖杠,那么就要用到“或”符號來連接他們了:0\d{2}-\d{8}|(0\d{2})\d{8} 。
ps:其他語言我不是很清楚澄成,但是OC中“|”運算符是判斷前面一個表達式胧洒,如果前面一個表達式是“true”的話,后面的運算就不會繼續(xù)進行下去了墨状,而正則表達式的“|”運算符也是一樣的卫漫,只要前面的表達式是ture得話,就不會繼續(xù)判斷下面的運算了肾砂。比如說:\d{3}|\d{3}-\d{4} 這個正則表達式列赎,因為前面的\d{3}部分和后面\d{3}部分一樣,當字符串 111-11匹配時候只會匹配到前面的三位通今,后面的“-11”都是匹配不到的粥谬。如果你還沒有打算向iOS以外的方向發(fā)展,我建議這個作為了解就好了辫塌。

分組:
這個比較容易漏策,就是用圓括號對“()”將其中某些語句括起來作為一個整體。
例如:[a-zA-Z0-9]+@[a-zA-Z0-9]+(.[a-zA-Z0-9]{2,4}){1,2} 這個是一個不完善的郵箱匹配的正則表達式臼氨,式子后面部分“(.[a-zA-Z0-9]{2,4}){1,2}” 可以看到掺喻,圓括號括起來的部分“.[a-zA-Z0-9]{2,4})”這里表示他們是一個整體,后面的“{1,2}”重復1或者兩次储矩,是相對于圓括號這個整體來說的感耙。整個正則表達式匹配像這樣的郵箱:abc12345@qq.com 或者匹配這樣的:980a@126.com.cn 這樣的郵箱(雖然我不知道這個郵箱后綴是否存在,但是這些都不是重點)持隧。

到這里即硼,我們可以來看2個例子,印證一下上面所講的東西:---------------------------------
(\d{1,3}.){3}\d{1,3}:是一個簡單的IP地址匹配表達式屡拨。要理解這個表達式只酥,請按下列順序分析它:\d{1,3}匹配1到3位的數字褥实,(\d{1,3}.){3}匹配三位數字加上一個英文句號(這個整體也就是這個分組)重復3次,最后再加上一個一到三位的數字(\d{1,3})裂允。(這個正則表達式其實并不準確损离,準確的IP地址描述是這樣的:((2[0-4]\d|25[0-5]|[01]?\d\d?).){3}(2[0-4]\d|25[0-5]|[01]?\d\d?))

(?0\d{2})?[- ]?\d{8}|0\d{2}[- ]?\d{8}這個表達式匹配3位區(qū)號的電話號碼,其中區(qū)號可以用小括號括起來绝编,也可以不用僻澎,區(qū)號與本地號間可以用連字號或空格間隔,也可以沒有間隔十饥。
如果上面兩個例子窟勃,你可以自己分析出來,那么基本上夠了绷跑。如果你想了解更多的有關正則表達式的知識拳恋,這里已經幫不到你了凡资,但是度娘肯定對你有幫助砸捏。http://www.jb51.net/tools/zhengze.html 而我自己的話是在這個網址了解的,有興趣可以去看一下隙赁。
最后差點忘了垦藏,還有一點:字符轉移的
如果你想查找元字符本身的話,比如你查找.,或者*,就出現了問題:你沒辦法指定它們伞访,因為它們會被解釋成別的意思掂骏。這時你就得使用\來取消這些字符的特殊意義。因此厚掷,你應該使用.和*弟灼。當然,要查找\本身冒黑,你也得用\.
例如:deerchao.net匹配deerchao.net田绑,C:\Windows匹配C:\Windows。
====================華麗的分割線=======================割割割==========
好了抡爹,說了這么多掩驱,都是正則表達式的內用,那么接下來我們還是看一下在Xcode中使這些正則表達式為我所用呢
首先介紹一下我的運行環(huán)境: 硬件:mac筆記本 系統(tǒng):OS X Yosemite 10.10.4 軟件:Xcode6.4
為了方便查看冬竟,我布局了一個頁面:(這次我用QQ號的正則表達式來做測試)

iOS開發(fā)中正則表達式的基礎使用 - 浪奇八寶粥 - I can see

布局代碼我相信大家都會寫欧穴,所以這里就不貼了 。下面是點擊藍色button的監(jiān)聽事件的代碼:

pragma mark - 監(jiān)聽btn的點擊事件

- (void)btnOnClick
{
    //將正則表達式作為字符串賦值給變量regex
    NSString *regex = @"\\d{5,12}";

    //根據正則表達式將NSPredicate的格式設置好
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];

    //判斷正則表達式能否正確匹配_textFiedld.text的內容
    BOOL isMatch = [pred evaluateWithObject:_textField.text];

    //顯示匹配結果
    if (isMatch) {
        _lab.text = @"匹配成功";
    } else {
        _lab.text = @"匹配失敗";
    }
}

運行結果如下:


iOS開發(fā)中正則表達式的基礎使用 - 浪奇八寶粥 - I can see
iOS開發(fā)中正則表達式的基礎使用 - 浪奇八寶粥 - I can see

[圖片上傳中泵殴。涮帘。。(4)]

截圖中已經給出了解釋笑诅,能不能理解就見仁見智了调缨!

文章到此就進入尾聲了映屋,以上所有只是個人學習的理解,如果有錯同蜻,還望指正棚点!

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市湾蔓,隨后出現的幾起案子瘫析,更是在濱河造成了極大的恐慌,老刑警劉巖默责,帶你破解...
    沈念sama閱讀 211,194評論 6 490
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件贬循,死亡現場離奇詭異,居然都是意外死亡桃序,警方通過查閱死者的電腦和手機杖虾,發(fā)現死者居然都...
    沈念sama閱讀 90,058評論 2 385
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來媒熊,“玉大人奇适,你說我怎么就攤上這事÷ⅲ” “怎么了嚷往?”我有些...
    開封第一講書人閱讀 156,780評論 0 346
  • 文/不壞的土叔 我叫張陵,是天一觀的道長柠衅。 經常有香客問我皮仁,道長,這世上最難降的妖魔是什么菲宴? 我笑而不...
    開封第一講書人閱讀 56,388評論 1 283
  • 正文 為了忘掉前任贷祈,我火速辦了婚禮,結果婚禮上喝峦,老公的妹妹穿的比我還像新娘势誊。我一直安慰自己,他們只是感情好愈犹,可當我...
    茶點故事閱讀 65,430評論 5 384
  • 文/花漫 我一把揭開白布键科。 她就那樣靜靜地躺著,像睡著了一般漩怎。 火紅的嫁衣襯著肌膚如雪勋颖。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,764評論 1 290
  • 那天勋锤,我揣著相機與錄音饭玲,去河邊找鬼。 笑死叁执,一個胖子當著我的面吹牛茄厘,可吹牛的內容都是我干的矮冬。 我是一名探鬼主播,決...
    沈念sama閱讀 38,907評論 3 406
  • 文/蒼蘭香墨 我猛地睜開眼次哈,長吁一口氣:“原來是場噩夢啊……” “哼胎署!你這毒婦竟也來了?” 一聲冷哼從身側響起窑滞,我...
    開封第一講書人閱讀 37,679評論 0 266
  • 序言:老撾萬榮一對情侶失蹤琼牧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后哀卫,有當地人在樹林里發(fā)現了一具尸體巨坊,經...
    沈念sama閱讀 44,122評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,459評論 2 325
  • 正文 我和宋清朗相戀三年此改,在試婚紗的時候發(fā)現自己被綠了趾撵。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,605評論 1 340
  • 序言:一個原本活蹦亂跳的男人離奇死亡共啃,死狀恐怖占调,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情勋磕,我是刑警寧澤妈候,帶...
    沈念sama閱讀 34,270評論 4 329
  • 正文 年R本政府宣布敢靡,位于F島的核電站挂滓,受9級特大地震影響,放射性物質發(fā)生泄漏啸胧。R本人自食惡果不足惜赶站,卻給世界環(huán)境...
    茶點故事閱讀 39,867評論 3 312
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望纺念。 院中可真熱鬧贝椿,春花似錦、人聲如沸陷谱。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,734評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽烟逊。三九已至渣窜,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間宪躯,已是汗流浹背乔宿。 一陣腳步聲響...
    開封第一講書人閱讀 31,961評論 1 265
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留访雪,地道東北人详瑞。 一個月前我還...
    沈念sama閱讀 46,297評論 2 360
  • 正文 我出身青樓掂林,卻偏偏與公主長得像,于是被迫代替她去往敵國和親坝橡。 傳聞我的和親對象是個殘疾皇子泻帮,可洞房花燭夜當晚...
    茶點故事閱讀 43,472評論 2 348

推薦閱讀更多精彩內容