正則表達(dá)式-簡單入門

前言

最近刷算法題慧邮,遇到了一個答案里面說到了正則表達(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)的咖熟,謝謝大家。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末柳畔,一起剝皮案震驚了整個濱河市馍管,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌薪韩,老刑警劉巖确沸,帶你破解...
    沈念sama閱讀 222,729評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件捌锭,死亡現(xiàn)場離奇詭異,居然都是意外死亡罗捎,警方通過查閱死者的電腦和手機(jī)观谦,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,226評論 3 399
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來宛逗,“玉大人坎匿,你說我怎么就攤上這事±准ぃ” “怎么了替蔬?”我有些...
    開封第一講書人閱讀 169,461評論 0 362
  • 文/不壞的土叔 我叫張陵,是天一觀的道長屎暇。 經(jīng)常有香客問我承桥,道長,這世上最難降的妖魔是什么根悼? 我笑而不...
    開封第一講書人閱讀 60,135評論 1 300
  • 正文 為了忘掉前任凶异,我火速辦了婚禮,結(jié)果婚禮上挤巡,老公的妹妹穿的比我還像新娘剩彬。我一直安慰自己,他們只是感情好矿卑,可當(dāng)我...
    茶點(diǎn)故事閱讀 69,130評論 6 398
  • 文/花漫 我一把揭開白布喉恋。 她就那樣靜靜地躺著,像睡著了一般母廷。 火紅的嫁衣襯著肌膚如雪轻黑。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,736評論 1 312
  • 那天琴昆,我揣著相機(jī)與錄音氓鄙,去河邊找鬼。 笑死业舍,一個胖子當(dāng)著我的面吹牛抖拦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播舷暮,決...
    沈念sama閱讀 41,179評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼蟋座,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了脚牍?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 40,124評論 0 277
  • 序言:老撾萬榮一對情侶失蹤巢墅,失蹤者是張志新(化名)和其女友劉穎诸狭,沒想到半個月后券膀,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 46,657評論 1 320
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡驯遇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,723評論 3 342
  • 正文 我和宋清朗相戀三年芹彬,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片叉庐。...
    茶點(diǎn)故事閱讀 40,872評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡舒帮,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出陡叠,到底是詐尸還是另有隱情玩郊,我是刑警寧澤,帶...
    沈念sama閱讀 36,533評論 5 351
  • 正文 年R本政府宣布枉阵,位于F島的核電站译红,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏兴溜。R本人自食惡果不足惜侦厚,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,213評論 3 336
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望拙徽。 院中可真熱鬧刨沦,春花似錦、人聲如沸膘怕。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,700評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽淳蔼。三九已至侧蘸,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間鹉梨,已是汗流浹背讳癌。 一陣腳步聲響...
    開封第一講書人閱讀 33,819評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留存皂,地道東北人晌坤。 一個月前我還...
    沈念sama閱讀 49,304評論 3 379
  • 正文 我出身青樓,卻偏偏與公主長得像旦袋,于是被迫代替她去往敵國和親骤菠。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,876評論 2 361

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

  • 推薦幾個正則表達(dá)式編輯器 Debuggex :https://www.debuggex.com/ PyRegex:...
    木易林1閱讀 11,500評論 9 151
  • 初衷:看了很多視頻疤孕、文章商乎,最后卻通通忘記了,別人的知識依舊是別人的祭阀,自己卻什么都沒獲得鹉戚。此系列文章旨在加深自己的印...
    DCbryant閱讀 4,020評論 0 20
  • 正則表達(dá)式到底是什么東西鲜戒?字符是計算機(jī)軟件處理文字時最基本的單位,可能是字母抹凳,數(shù)字遏餐,標(biāo)點(diǎn)符號,空格赢底,換行符失都,漢字等...
    獅子挽歌閱讀 2,150評論 0 9
  • 幾個正則表達(dá)式編輯器 Debuggex :https://www.debuggex.com/ PyRegex:ht...
  • 注:本篇文章只為方便查看,特此保留幸冻,如有冒犯粹庞,敬請諒解!`叶蟆信粮! 本文目標(biāo) 30分鐘內(nèi)讓你明白正則表達(dá)式是什么,并對它...
    阿杰Alex閱讀 1,486評論 0 10