正則表達式晨汹?什么是正則表達式?
百度百科給出的解釋是這樣的:正則表達式使用單個字符串來描述桃漾、匹配一系列符合某個句法規(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號的正則表達式來做測試)
布局代碼我相信大家都會寫欧穴,所以這里就不貼了 。下面是點擊藍色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 = @"匹配失敗";
}
}
運行結果如下:
[圖片上傳中泵殴。涮帘。。(4)]
截圖中已經給出了解釋笑诅,能不能理解就見仁見智了调缨!
文章到此就進入尾聲了映屋,以上所有只是個人學習的理解,如果有錯同蜻,還望指正棚点!