前言
最近刷算法題慧邮,遇到了一個答案里面說到了正則表達(dá)式馁筐,之前在群里也看到有人說正則表達(dá)式怎么用涂召,一直沒有留意,現(xiàn)在正好用到了敏沉,在這里總結(jié)一下果正。其實(shí)呢,百度一下有很多關(guān)于正則表達(dá)式的資料盟迟,這里我們進(jìn)行的不只是復(fù)制秋泳,還有就是簡單的解釋和理解。
這個正則表達(dá)式還是挺難理解的攒菠,但是我們靜下心來慢慢的研究一番迫皱,還是能夠找到一些規(guī)律的。
其實(shí)我們上了這么多年的學(xué)辖众,也明白一個道理:凡事都是有規(guī)律可循的卓起。
只要我們能夠找到其中的規(guī)律,就能夠短時間的使用這個知識凹炸,就例如我們大學(xué)一學(xué)期都在玩戏阅,考試前背書然后通過考試一樣,再例如我們初高中的數(shù)學(xué)啤它,其實(shí)我們到了初三高三的時候會發(fā)現(xiàn)奕筐,只要我們找到了規(guī)律,一眼就能看出出題人是什么意思变骡,要考察的是哪個知識點(diǎn)离赫,那么我們就能正確的解題了。
廢話不說塌碌,來說說正則表達(dá)式渊胸。
引用網(wǎng)友的一句話:如果你不覺得正則表達(dá)式很難讀寫的話,要么你是一個天才誊爹,要么蹬刷,你不是地球人。正則表達(dá)式的語法很令人頭疼频丘,即使對經(jīng)常使用它的人來說也是如此办成。
對于一個新的知識我們的認(rèn)知過程無非就是:查資料了解--尋找規(guī)律--學(xué)會使用--解決問題--最后熟練精通使用。
在這里我們也用這個方法對正則表達(dá)式進(jìn)行解釋搂漠。那么我們首先來看看什么是正則表達(dá)式迂卢。
概念
在編寫處理字符串的程序或網(wǎng)頁時,經(jīng)常會有查找符合某些復(fù)雜規(guī)則的字符串的需要。正則表達(dá)式就是用于描述這些規(guī)則的工具而克。換句話說靶壮,正則表達(dá)式就是記錄文本規(guī)則的代碼。
很可能你使用過Windows/Dos下用于文件查找的通配符(wildcard)员萍,也就是*和?腾降。如果你想查找某個目錄下的所有的Word文檔的話,你會搜索*.doc碎绎。在這里螃壤,*會被解釋成任意的字符串。和通配符類似筋帖,正則表達(dá)式也是用來進(jìn)行文本匹配的工具奸晴,只不過比起通配符,它能更精確地描述你的需求——當(dāng)然日麸,代價就是更復(fù)雜——比如你可以編寫一個正則表達(dá)式寄啼,用來查找所有以0開頭,后面跟著2-3個數(shù)字代箭,然后是一個連字號“-”墩划,最后是7或8位數(shù)字的字符串(像010-12345678或0376-7654321)。
正則表達(dá)式是對字符串操作的一種邏輯公式梢卸,就是用事先定義好的一些特定字符走诞、及這些特定字符的組合,組成一個“規(guī)則字符串”蛤高,這個“規(guī)則字符串”用來表達(dá)對字符串的一種過濾邏輯。
下邊我們說一下正則表達(dá)式的目的和特點(diǎn):
給定一個正則表達(dá)式和另一個字符串碑幅,我們可以達(dá)到如下的目的:
1. 給定的字符串是否符合正則表達(dá)式的過濾邏輯(稱作“匹配”)戴陡;
2. 可以通過正則表達(dá)式,從字符串中獲取我們想要的特定部分沟涨。
正則表達(dá)式的特點(diǎn)是:
1. 靈活性恤批、邏輯性和功能性非常的強(qiáng);
2. 可以迅速地用極簡單的方式達(dá)到字符串的復(fù)雜控制裹赴。
3. 對于剛接觸的人來說喜庞,比較晦澀難懂。
上邊特點(diǎn)里面的第2點(diǎn)其實(shí)就是我們要學(xué)習(xí)正則表達(dá)式的一個核心目的棋返,也是最主要最重要的目的延都,我們就是要在短時間內(nèi)迅速的利用極簡單的方式達(dá)到字符串的復(fù)雜控制的目的。
首先添加傳送門:算法面試題睛竣,也就是因?yàn)檫@里面的第一道題晰房,我才有了開始了解正則的原因。
理解
我們這里以題目為媒介,通過具體的題目來學(xué)習(xí)殊者,在實(shí)踐中成長与境。
(^a{2}[^a]) ? ? ? ?以aa(第三個字母不是a)開頭 ? ? ? ? ------(1)
([^a]a{2}[^a]) ? 字符串中間的aa(前后都不是a) ? ? ? ------(2)
([^a]a{2}$) ? ? ? 以aa結(jié)尾(倒數(shù)第三個字母不是a) ? ------(3)
因?yàn)檎齽t里面好多符號,【為了區(qū)分開猖吴,我在后邊標(biāo)注了(1)摔刁、(2)、(3)】
首先第1條里面我們把代碼分開海蔽,首先我們看這個a{2}
根據(jù)上圖共屈,我們可以理解上邊的a{2}的意思就是“把a(bǔ)重復(fù)2遍”。
再看這個[^a]
根據(jù)上圖准潭,我們可以理解上邊的[^a]的意思就是“不是a”趁俊。
再看這個^
根據(jù)上圖,我們可以理解上邊的^的意思就是“開始的位置”刑然。
那么我們就能夠看出第一條的(^a{2}[^a])意思就是“字符串是aa開頭寺擂,并且aa后邊的字符不是a”,正好和人家給的解釋是一樣的“以aa(第三個字母不是a)開頭”泼掠。
同理我們就能知道第二條的意思了:([^a]a{2}[^a])意思就是“字符串是aa但是aa的前面一個字符不是a怔软,并且aa后邊的一個字符也不是a”,和人家給的解釋是一樣的“字符串中間的aa(前后都不是a)”
第三條里面([^a]a{2}$)择镇,我們?nèi)タ瓷蠄D的解釋$的意思就是字符串結(jié)尾挡逼。那么第三條的意思就是“字符串a(chǎn)a,前面的一個字符不是a腻豌,并且后邊沒有字符了”家坎,和人家給的解釋是一樣的“以aa結(jié)尾(倒數(shù)第三個字母不是a)”。
這樣的排列組合我們就可以判斷apaapaaapaa -> apbbpaaapbb這道題里面吝梅,把所有連續(xù)出現(xiàn)的2個a替換成bb(2個b)虱疏,但是對于超過兩個連續(xù)的a,那么這些字符都不作替換苏携,這里連續(xù)的a出現(xiàn)了4次做瞪,只有第二段和最后一段被替換。
當(dāng)然正則表達(dá)式的作用其實(shí)就是在一段字符串里面查找特定的字符串右冻,經(jīng)常會有查找符合某些復(fù)雜規(guī)則的字符串的需要装蓬,正則表達(dá)式就是用于描述這些規(guī)則的工具,其實(shí)吧纱扭,說的簡單一些這個正則表達(dá)式是怎么回事呢:其實(shí)就是NSString里面的stringByReplacingOccurrencesOfString這個方法牍帚,查找替換字符串,而正則表達(dá)式就是對需要查找的復(fù)雜的字符串進(jìn)行了封裝跪但。
下邊我們來看看正則里面給封裝好的一些字符串格式:
(1)履羞、匹配中文字符的正則表達(dá)式: [u4e00-u9fa5]
用法:regex = new Regex("^[\\u4e00-\\u9fa5]+$");
這里就是說匹配所有中文峦萎,即:如果輸入框里必須要求是中文,那么出現(xiàn)別的類似數(shù)字忆首、字母爱榔、符號等就不對了,這時就能用這個的非糙及,就可以判斷了详幽。
(2)、匹配空白行的正則表達(dá)式:ns*r
可以用來刪除空白行浸锨,一般情況我們不會用到這個唇聘,因?yàn)槿绻涌跊]有bug,不會給我們返回空白行柱搜。而我們自己也不會寫一個空白行迟郎。。聪蘸。
(3)宪肖、匹配首尾空白字符的正則表達(dá)式:^s*|s*$
從上邊的圖我們可以看出小寫的s匹配任何空白字符。之前我們了解到^表示開始的位置健爬,*表示重復(fù)0次或者更多次控乾,那么^s*的意思就是“開始的位置是空白字符”,同理我們可以知道這個s*$的意思是“結(jié)尾的位置是空白字符”娜遵。
可以用來刪除行首行尾的空白字符(包括空格蜕衡、制表符、換頁符等等)设拟,非常有用的表達(dá)式慨仿。
(4)、匹配Email地址的正則表達(dá)式:w+([-+.]w+)*@w+([-.]w+)*.w+([-.]w+)*
表單驗(yàn)證時很實(shí)用纳胧。(這個有點(diǎn)復(fù)雜镶骗,,躲雅,不在咱們《入門》的范圍內(nèi))
(5)、匹配帳號是否合法(字母開頭骡和,允許5-16字節(jié)相赁,允許字母數(shù)字下劃線):^[a-zA-Z][a-zA-Z0-9_]{4,15}$
表單驗(yàn)證時很實(shí)用
(6)、匹配國內(nèi)電話號碼:d{3}-d{8}|d{4}-d{7}
匹配形式如 0311-4405222 或 010-87888822
(7)慰于、匹配騰訊QQ號:[1-9][0-9]{4,}
騰訊QQ號從10000開始
(8)钮科、匹配身份證:d{15}|d{18}
中國的身份證為15位或18位
(9) ? ^[A-Za-z0-9]+$ ?匹配由數(shù)字和26個英文字母組成的字符串
(10) ^w+$ ? ? ? ? ? ? ? ? ?匹配由數(shù)字、26個英文字母或者下劃線組成的字符串
(11)
說了這么多婆赠,我們應(yīng)該大概的知道正則表達(dá)式是什么了:可以迅速地用極簡單的方式達(dá)到字符串的復(fù)雜控制绵脯。
字符串可以由很多字符構(gòu)成,各種字符的排列組合又生出各種規(guī)則的字符串,而一些特定的字符串是有自己的規(guī)則的:例如手機(jī)號碼最起碼的要求是11位數(shù)字蛆挫,這里面自然不能有字母赃承、空格、漢字等悴侵。又例如某密碼設(shè)置只能是大小寫字母瞧剖,不能是漢字、特殊字符可免、空格等抓于。那么我們就可以用正則表達(dá)式,比較簡單的方式浇借,達(dá)到字符串復(fù)雜的篩選和判斷的效果捉撮。
使用
那么我們在iOS中怎么使用這個正則表達(dá)式呢?
大概有三種方式使用:一種是和NSPredicate使用妇垢,一種是NSString的方法里面有一個可以使用巾遭,最后一個是正則表達(dá)式類NSRegularExpression,這個應(yīng)該才是最正規(guī)的修己。而我們command+點(diǎn)擊恢总,進(jìn)入這個正則表達(dá)式的類里面進(jìn)行查看的時候,發(fā)現(xiàn)里面并沒有很多篇幅睬愤,對最一開始的正則表達(dá)式類的描述進(jìn)行翻譯:NSRegularExpression is a class used to represent and apply regular expressions.? An instance of this class is an immutable representation of a compiled regular expression pattern and various option flags.(NSRegularExpression是一個類用來表示和應(yīng)用正則表達(dá)式片仿。這個類的實(shí)例是不可變的編譯正則表達(dá)式模式和各種選項的旗幟)。
其實(shí)我們在自己的工程里面可以搜索一下“NSRegularExpression”尤辱,可以看到大多的是三方庫里面進(jìn)行了使用砂豌,而我們自己使用的情況并不多,一是有的三方庫為我們做好了處理光督,我們直接拿來用即可阳距;另外也是由于這個正則表達(dá)式雖然表達(dá)起來比較簡單,但是學(xué)習(xí)和理解起來并不是那么容易结借,所以我們更多的選擇是自己運(yùn)用自己會的知識對需求里面某些字符串限定要求作處理筐摘。
參考:關(guān)于正則表達(dá)式的介紹:正則表達(dá)式_百度百科
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??正則表達(dá)式語法
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 常用正則表達(dá)式大全(轉(zhuǎn))
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??正則表達(dá)式30分鐘入門教程
? ? ? ? ?關(guān)于正則表達(dá)式的使用:正則表達(dá)式在iOS中的運(yùn)用
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??iOS開發(fā)之詳解正則表達(dá)式
最后,哪里不對的地方可以給我留言船老,我會及時改進(jìn)的咖熟,謝謝大家。