iOS 高級開發(fā)_ 正則表達式

前言

開發(fā)中經(jīng)常會用到正則表達式來匹配或者過濾目標字符串鼠锈,從而提高自己的開發(fā)效率岭粤。本文主要通過介紹正則表達式,讓你對正則表達式有一個基本的了解派昧,從而可以應用在自己的開發(fā)過程中(主要是iOS 開發(fā)中黔姜,文中會有demo講解),再次更深層次的學習不做講解蒂萎,文中有學習鏈接秆吵,有興趣的可以進行更深層次的研究。

簡介

正則表達式五慈,又稱正規(guī)表示式纳寂、正規(guī)表示法、正規(guī)表達式泻拦、規(guī)則表達式毙芜、常規(guī)表示法(英語:Regular Expression,在代碼中常簡寫為regex争拐、regexp或RE)腋粥,計算機科學的一個概念。正則表達式使用單個字符串來描述架曹、匹配一系列匹配某個句法規(guī)則的字符串灯抛。在很多文本編輯器里,正則表達式通常被用來檢索音瓷、替換那些匹配某個模式的文本对嚼。
許多程序設計語言都支持利用正則表達式進行字符串操作。例如绳慎,在Perl中就內建了一個功正則表達式則表達式引擎纵竖。正則表達式這個概念最初是由Unix中的工具軟件(例如sed和gr正則表達式開的漠烧。正則表達式通常縮寫成“regex”靡砌,單數(shù)有regexp已脓、regex,復數(shù)有regexps通殃、regexes度液、regexen。

-----維基百科

上面一大段書面式刻板的簡介不知道大家有沒有耐心看完画舌,看到那么多專業(yè)且刻板的術語堕担,讀完還是不了解正則表達式到底是什么。其實上面的文字總結為一句話:正則表達式就是用于記錄文本規(guī)則的代碼曲聂。

舉例說明:在使用windows過程中霹购,我們經(jīng)常使用 ? 和 * 通配符來查找硬盤上的文件。? 通配符匹配文件名中的單個字符朋腋,而 * 通配符匹配零個或多個字符齐疙。
使用 data?.zip 這樣的模式將查找下列文件:>datas.zip

data1.zip
data2.zip
data3.zip

使用 * 字符代替 ? 字符擴大了找到的文件的數(shù)量。data*.dat 匹配下列所有文件:

datas.zip
dataSource.zip
dataArray.zip
dataDic.zip

這種搜索方式在使用電腦的日常生活中很有用旭咽,但是對于大多數(shù)的場景來說贞奋,它還是有限的。通過通配符的工作原理穷绵,引入正則表達式的概念忆矛。正則表達式和通配符類似,同樣用于文本匹配请垛,只不過跟通配符比較起來催训,正則表達式功能更加強大并且更加靈活,更加精確的描述你的需求宗收。

常用功能

不管是文檔編輯軟件或者是IDE中都提供了搜索和替換功能漫拭,這些功能基本可以滿足我們的一些基本操作,但是對于無法使用軟件的情況下混稽,我們想要從茫茫的數(shù)據(jù)中查找到與滿足自己需求的數(shù)據(jù)采驻,就又寫捉襟見肘。通過正則表達式可以滿足你的這些需求:

  • 數(shù)據(jù)校驗
    正如上面所總結的:正則表達式就是用于記錄文本規(guī)則的代碼匈勋。我們寫一段規(guī)則礼旅,通過特定的語法來查看目標字符串是否符合這個規(guī)則。例如:手機號校驗洽洁、郵箱地址校驗痘系、密碼(6-12位數(shù)字字母密碼)校驗等等
  • 文本替換&文本提取首先通過正則表達式來識別某些特定文本,并對該特定文本執(zhí)行提取饿自、刪除或替換等操作汰翠。

語法

正則表達式是由兩種基本字符組成:普通字符(例如字符 a 到 z)以及特殊字符(稱為"元字符" --- metacharacter)所組成的描述文本規(guī)則的代碼龄坪。規(guī)則用來描述在搜索文本時要匹配的一個或多個字符串。正則表達式作為文本規(guī)則复唤,將某個文本規(guī)則與所搜索的字符串進行匹配健田。

入門

學習正則表達式最好的方法就是從現(xiàn)有的例子開始,理解例子之后佛纫,在其基礎之上修改實驗妓局。在接下來的講解中,會結合簡單的例子來加深對正則表達式的理解呈宇。

元字符

元字符就是指那些在正則表達式中具有特殊意義的專用字符好爬,用來規(guī)定其前導字符(位于元字符前面的字符)在目標對象中的出現(xiàn)規(guī)則,一個元字符可以用來匹配一個或者多個字符攒盈。

總結:元字符就是正則表達式中用來描述一個文本規(guī)則的專用字符抵拘。
舉例:精確查找“ab”在未使用正則表達式之前哎榴,查找ab型豁,我們可能會得到以下結果

abc
cab
cabc

元字符:\b精確查找的ab字符的正則表達式為:\bab\b 。\b 代表文本的開頭或者結尾尚蝌,也就是文本的邊界迎变,上面的正則表達式表示的意思是 :以a開頭,以b結尾的文本規(guī)則飘言。并且\b 并不會匹配分隔字符(空格衣形、標點符號、換行符)中的任何一個姿鸿,只是單純的匹配一個位置谆吴。

元字符:.可以理解為匹配除換行符以外的任意字符**

元字符:* 代表的不是字符(因為正則表達式*是用于描述文本規(guī)則的一段代碼,代表規(guī)則苛预,不代表字符)句狼,也不是位置,而是數(shù)量----它指定前邊的內容可以連續(xù)重復使用任意次以使整個表達式得到匹配热某。

元字符:\d可以用于匹配一個數(shù)字(0-9)腻菇,舉例說明:0\d\d-\d\d\d\d\d\d\d\d 匹配這樣的字符串:以0開頭,然后是兩個數(shù)字昔馋,然后是一個連字號“-”筹吐,最后是8個數(shù)字(用來匹配中國的座機號,當然秘遏,這個例子只能匹配區(qū)號為3位的情形)丘薛。當然表達同樣的意思還有一個簡單的寫法:0\d{2}-\d{8} 這里\d后面的{2}和{8}的意思是前面\d必須連續(xù)重復匹配2次和8次。
綜合例子: \bCrab\b.*\bMan\b:用于匹配以Crab開頭邦危,中間跟著任意個數(shù)任意字符榔袋,然后以Man結尾的字符串

<div align = center> 表一:常用的元字符 </div>

元字符 說明
. 匹配除換行符以外的任意字符
\w 匹配字母或數(shù)字或下劃線或漢字
\s 任意的空白符周拐,包括空格,制表符(Tab)凰兑,換行符妥粟,中文全角空格等
\d 匹配數(shù)字(0-9)
\b 匹配單詞的開始或結束
^ 匹配字符串的開始
$ 匹配字符串的結束

結合例子說明:

\ba\w\b匹配以字母a開頭的單詞——先是某個單詞開始處(\b),然后是字母a,然后是任意數(shù)量的字母或數(shù)字(\w)吏够,最后是單詞結束處(\b)勾给。\d+** 匹配1個或更多連續(xù)的數(shù)字。這里的+是和*類似的元字符锅知,不同的是*匹配重復任意次(可能是0次)播急,而+則匹配重復1次或更多次。\b\w{6}\b 匹配剛好6個字符的單詞售睹。元字符 ^(和數(shù)字6在同一個鍵位上的符號)和 $ 都匹配一個位置桩警,這和\b有點類似。^匹配你要用來查找的字符串的開頭昌妹,$ 匹配結尾捶枢。這兩個代碼在驗證輸入的內容時非常有用,比如一個網(wǎng)站如果要求你填寫的QQ號必須為5位到12位數(shù)字時飞崖,可以使用:^\d{5,12}$烂叔。這里的 {5,12} 和前面介紹過的{2}是類似的,只不過{2}匹配只能不多不少重復2次固歪,{5,12} 則是重復的次數(shù)不能少于5次蒜鸡,不能多于12次,否則都不匹配牢裳。因為使用了 ^$逢防,所以輸入的整個字符串都要用來和 \d{5,12} 來匹配,也就是說整個輸入必須是5到12個數(shù)字蒲讯,因此如果輸入的QQ號能匹配這個正則表達式的話忘朝,那就符合要求了。

限定符

正則表達式中提供了有一類用于限定字符數(shù)量的符號伶椿,稱為 限定符辜伟。并且限定符分為兩種 :

  • 貪婪的:嘗試盡可能多的匹配元素
  • 惰性(非貪婪)的:盡可能的少的匹配元素

通過添加問號即 ?可以將貪婪限定符轉為惰性限定符脊另。
從前面的綜合例子中导狡,大概已經(jīng)知道了限定字符數(shù)量的字符 例如 :* ,+偎痛,{2}...

<div align = center> 表2 常用的限定符</div>

貪婪限定符 惰性限定符 說明
* *? 重復零次或更多次
+ *+ 重復一次或更多次
? ?? 重復零次或一次
{n} {n}? 重復n次
{n,} {n,}? 重復n次或更多次
{n,m} {n,m}? 重復n到m次

關于貪婪限定符與惰性限定符之間的區(qū)別以及完整介紹旱捧,戳這里進一步了解

參考文檔:

《正則表達式30分鐘入門教程》
《正則表達式必知必會》

正則表達式在iOS中的應用

1.NSString的方法

- (NSRange)rangeOfString:(NSString *)aString options:(NSStringCompareOptions)mask{
NSString *searchText = @"rangeOfString";
NSRange range = [searchText rangeOfString:@"^[0-9]+$" options:NSRegularExpressionSearch];
if (range.location != NSNotFound) { 
NSLog(@"range :%@", [searchText substringWithRange:range]);
}

2.NSPredicate
Cocoa框架中的NSPredicate用于查詢,原理和用法都類似于SQL中的where,作用相當于數(shù)據(jù)庫的過濾取枚赡。 我們可以編寫簡單的謂詞語句氓癌,就可以從數(shù)組中過濾出我們想要的數(shù)據(jù)。 代碼示例:

+ (BOOL)validateEmail:(NSString *)email{ 
NSString *emailRegex = @"[A-Z0-9a-z._%+-]+@[A-Za-z0-9.-]+\\.[A-Za-z]{2,4}";
 NSPredicate *emailTest = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", emailRegex]; 
return [emailTest evaluateWithObject:email];
}

3.NSRegularExpression
NSRegularExpression這個類是蘋果專門封裝的一個用來處理正則表達式的類贫橙。
代碼示例:

objectivecNSString *searchText = @"you want to match"; 
NSError *error = NULL;
NSRegularExpression *regex = [NSRegularExpression regularExpressionWithPattern:@"^[0-9]+$" options:NSRegularExpressionCaseInsensitive error:&error];
NSTextCheckingResult *result = [regex firstMatchInString:searchText options:0 range:NSMakeRange(0, [searchText length])];
if (result) {
 NSLog(@"%@", [searchText substringWithRange:result.range]);
}

未完待續(xù)....

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末贪婉,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子卢肃,更是在濱河造成了極大的恐慌疲迂,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,430評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件莫湘,死亡現(xiàn)場離奇詭異尤蒿,居然都是意外死亡,警方通過查閱死者的電腦和手機幅垮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,406評論 3 398
  • 文/潘曉璐 我一進店門腰池,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人忙芒,你說我怎么就攤上這事示弓。” “怎么了匕争?”我有些...
    開封第一講書人閱讀 167,834評論 0 360
  • 文/不壞的土叔 我叫張陵避乏,是天一觀的道長爷耀。 經(jīng)常有香客問我甘桑,道長,這世上最難降的妖魔是什么歹叮? 我笑而不...
    開封第一講書人閱讀 59,543評論 1 296
  • 正文 為了忘掉前任跑杭,我火速辦了婚禮,結果婚禮上咆耿,老公的妹妹穿的比我還像新娘德谅。我一直安慰自己,他們只是感情好萨螺,可當我...
    茶點故事閱讀 68,547評論 6 397
  • 文/花漫 我一把揭開白布窄做。 她就那樣靜靜地躺著,像睡著了一般慰技。 火紅的嫁衣襯著肌膚如雪椭盏。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,196評論 1 308
  • 那天吻商,我揣著相機與錄音掏颊,去河邊找鬼。 笑死,一個胖子當著我的面吹牛乌叶,可吹牛的內容都是我干的盆偿。 我是一名探鬼主播,決...
    沈念sama閱讀 40,776評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼准浴,長吁一口氣:“原來是場噩夢啊……” “哼事扭!你這毒婦竟也來了?” 一聲冷哼從身側響起乐横,我...
    開封第一講書人閱讀 39,671評論 0 276
  • 序言:老撾萬榮一對情侶失蹤句旱,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后晰奖,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體谈撒,經(jīng)...
    沈念sama閱讀 46,221評論 1 320
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,303評論 3 340
  • 正文 我和宋清朗相戀三年匾南,在試婚紗的時候發(fā)現(xiàn)自己被綠了啃匿。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,444評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡蛆楞,死狀恐怖溯乒,靈堂內的尸體忽然破棺而出,到底是詐尸還是另有隱情豹爹,我是刑警寧澤裆悄,帶...
    沈念sama閱讀 36,134評論 5 350
  • 正文 年R本政府宣布,位于F島的核電站臂聋,受9級特大地震影響光稼,放射性物質發(fā)生泄漏。R本人自食惡果不足惜孩等,卻給世界環(huán)境...
    茶點故事閱讀 41,810評論 3 333
  • 文/蒙蒙 一艾君、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧肄方,春花似錦冰垄、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,285評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至隅要,卻和暖如春蝴罪,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背拾徙。 一陣腳步聲響...
    開封第一講書人閱讀 33,399評論 1 272
  • 我被黑心中介騙來泰國打工洲炊, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 48,837評論 3 376
  • 正文 我出身青樓暂衡,卻偏偏與公主長得像询微,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子狂巢,可洞房花燭夜當晚...
    茶點故事閱讀 45,455評論 2 359

推薦閱讀更多精彩內容